如何转义要传递给DecimalFormat的字符串

时间:2010-08-22 08:48:31

标签: java

我可以知道如何将字符串转义为十进制格式吗?

// currencySymbolPrefix can be any string.
NumberFormat numberFormat = new DecimalFormat(currencySymbolPrefix + "#,##0.00");

如何逃避currencySymbolPrefix,以便它可能包含任何字符,包括'#',并且不会被解释为其中一种模式。

请不要建议

NumberFormat numberFormat = new DecimalFormat("#,##0.00");
final String output = currencySymbolPrefix + numberFormat.format(number);

因为我的供应商的方法只接受单个NumberFormat。

3 个答案:

答案 0 :(得分:10)

您可以使用撇号来引用:

String pattern = "'" + currencySymbolPrefix + "'#,##0.00";
NumberFormat numberFormat = new DecimalFormat(pattern);

如果currencySymbolPrefix本身可能包含撇号,则需要通过将它们加倍来逃避它们:

String pattern = "'" + currencySymbolPrefix.replace("'", "''") + "'#,##0.00";

答案 1 :(得分:4)

引用特殊字符按字母顺序处理

DecimalFormat允许您引用特殊字符来对其进行字面处理。

  

模式中的许多字符都是字面意思;它们在解析期间匹配,并在格式化期间输出不变。另一方面,特殊字符代表其他字符,字符串或字符类。除非另有说明,否则必须引用它们,如果它们作为文字出现在前缀或后缀中。

     

'可用于引用前缀或后缀中的特殊字符,例如"'#'#"格式123"#123"。要创建单引号本身,请连续使用两个:"# o''clock"

因此,您可以为DecimalFormat编写通用字符串转义器,如下所示:

// a general-purpose string escaper for DecimalFormat

public static String escapeDecimalFormat(String s) {
    return "'" + s.replace("'", "''") + "'";
}

然后你就可以在你的情况下使用它:

    String currencySymbolPrefix = "<'#'>";
    NumberFormat numberFormat = new DecimalFormat(
        escapeDecimalFormat(currencySymbolPrefix) + "#,##0.00"
    );  
    System.out.println(numberFormat.format(123456.789));
    // <'#'>123,456.79

DecimalFormat

中插入货币符号时

应该注意的是,对于货币符号,NumberFormat确实具有方法setCurrency(Currency)DecimalFormat实现了此方法。如果您使用ISO 4217 currencies之一,则可以在setCurrency上使用java.util.Currency实例DecimalFormat。这也将为您处理符号映射等。

  

¤ (\u00A4)是货币符号,替换为货币符号。如果加倍,则用国际货币符号代替。如果存在于模式中,则使用货币小数分隔符而不是小数分隔符。

以下是一个例子:

    NumberFormat numberFormat = new DecimalFormat("¤#,##0.00");
    numberFormat.setCurrency(Currency.getInstance("USD"));
    System.out.println(numberFormat.format(123456.789));
    // $123,456.79

答案 2 :(得分:0)

根据documentation,你可以使用unicode。