NumberFormat括号文本为负数

时间:2015-09-30 11:02:14

标签: android locale currency number-formatting

我使用

在活动中显示负数
  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作为LocationListener

这里有什么问题?

2 个答案:

答案 0 :(得分:1)

From the documentation:

  

警惕默认语言环境

     

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

     

默认语言环境适用于涉及向用户显示数据的任务。在这种情况下,您希望使用用户的日期/时间格式,数字格式,转换为小写的规则等。在这种情况下,使用便捷方法是安全的。

     

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

     

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

     

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

答案 1 :(得分:0)

感谢@Bonati

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

这对我来说很好。