【问题标题】:NumberFormat bracketted text to negative numbersNumberFormat 括号内的文本到负数
【发布时间】:2015-09-30 11:02:14
【问题描述】:

我在 Activity 中使用显示负数

  double value = -1.0;
  NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(Locale.US);
  String formattedText = defaultFormat.format(value);

但是当我在Samsung Galaxy S5 (Android 4.4.2) 上运行它时,我得到($1.0),而Nexus 5 (Android 5.1.1) 给出它为-$1.0

这里有什么问题?

【问题讨论】:

    标签: android locale currency number-formatting


    【解决方案1】:

    From the documentation:

    注意默认的语言环境

    请注意,有许多便捷方法会自动使用默认语言环境,但使用它们可能会导致细微的错误。

    默认区域设置适用于涉及向用户呈现数据的任务。在这种情况下,您希望使用用户的日期/时间格式、数字格式、小写转换规则等。在这种情况下,使用便捷方法是安全的。

    默认语言环境不适用于机器可读的输出。最好的选择通常是 Locale.US——这个语言环境保证在所有设备上都可用,而且它没有令人惊讶的特殊情况并且经常使用(特别是用于计算机-计算机通信)这一事实意味着它往往是也是最有效的选择。

    一个常见的错误是在生成机器可读的输出时隐式使用默认语言环境。这往往适用于开发人员的测试设备(特别是因为有很多开发人员使用 en_US),但在用户处于更复杂语言环境的设备上运行时会失败。

    例如,如果您正在格式化整数,某些语言环境将使用非 ASCII 十进制数字。再举一个例子,如果您正在格式化浮点数,某些语言环境将使用 ',' 作为小数点和 '.'用于数字分组。这对于人类可读的输出是正确的,但如果呈现给另一台计算机可能会导致问题(例如,parseDouble(String) 无法解析这样的数字)。您还应该警惕不采用 Locale 的 toLowerCase() 和 toUpperCase() 重载:例如,在土耳其,字符 'i' 和 'I' 不会转换为 'I' 和 'i '。这是土耳其语文本(例如用户输入)的正确行为,但不适用于 HTTP 标头。

    【讨论】:

    • 是的,你是对的。现在我使用我自己的格式化程序 NumberFormat defaultFormat = new DecimalFormat("'$'0.00"); return defaultFormat.format(value);
    【解决方案2】:

    感谢@Bonati

    public static String formatAmount(double value) {
            NumberFormat numberFormat = new DecimalFormat("'$'0.00");
            return numberFormat.format(value);
        }
    

    这对我来说很好。

    【讨论】:

    • 如果某个答案对您有所帮助,请单击其下方的绿色 V 以标记为“已回答”,这将关闭问题。如果您需要其他帮助或其他帮助,请发布新问题或编辑您的问题以询问您的需求。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2021-06-07
    • 2017-01-17
    相关资源
    最近更新 更多