如何在Java中格式化整数?

3
我正在尝试将此格式应用于给定的整数 #´###,###。我尝试使用 DecimalFormat 类,但它只允许有一个分组分隔符号,而我需要有两个分隔符号,一个用于表示百万的重音符号,另一个用于表示千位数的逗号。

因此,最终我可以按照这种方式格式化值,如 1,000 或以这种方式表示百万 1´000,000


请参考以下链接,了解如何在Java中将电话号码格式化为字符串:https://dev59.com/Sm435IYBdhLWcg3w9FHi - Roshan
@Roshan,那个问题中的解决方案使用了substring()replace(),对于电话号码可能没问题,但是在处理实际数字(比如金钱)时并不是最好的选择。原帖的作者需要考虑到负数、没有小数点的数字等情况。 - walen
谢谢@Roshan! - Donald Fernandez
4个回答

1

我总是更喜欢使用String.format,但我不确定是否有一个Locale可以像这样格式化数字。以下是一些可以完成工作的代码。

// Not sure if you wanted to start with a number or a string. Adjust accordingly
String stringValue = "1000000";
float floatValue = Float.valueOf(stringValue);

// Format the string to a known format
String formattedValue = String.format(Locale.US, "%,.2f", floatValue);

// Split the string on the separator
String[] parts = formattedValue.split(",");

// Put the parts back together with the special separators
String specialFormattedString = "";
int partsRemaining = parts.length;
for(int i=0;i<parts.length;i++)
{
    specialFormattedString += parts[i];
    partsRemaining--;
    if(partsRemaining > 1)
        specialFormattedString += "`";
    else if(partsRemaining == 1)
        specialFormattedString += ",";
}

1

尝试使用这些Locale格式来满足您的需求。

    List<Locale> locales = Arrays.asList(new Locale("it", "CH"), new Locale("fr", "CH"), new Locale("de", "CH"));
    for (Locale locale : locales) {
        DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance(locale);
        DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
        dfs.setCurrencySymbol("");
        df.setDecimalFormatSymbols(dfs);
        System.out.println(String.format("%5s %15s %15s", locale, format(df.format(1000)), format(df.format(1_000_000))));
    }

实用方法。
private static String format(String str) {
    int index = str.lastIndexOf('\'');
    if (index > 0) {
        return new StringBuilder(str).replace(index, index + 1, ",").toString();
    }
    return str;
}

输出

it_CH        1,000.00    1'000,000.00
fr_CH        1,000.00    1'000,000.00
de_CH        1,000.00    1'000,000.00

df.setMaximumFractionDigits(0); 设置为0,以去除小数部分。

输出

it_CH           1,000       1'000,000
fr_CH           1,000       1'000,000
de_CH           1,000       1'000,000

1

我发现@Roshan在评论中提供的链接非常有用,这个解决方案使用了正则表达式和replaceFirst方法。

public static String audienceFormat(int number) {
    String value = String.valueOf(number);

    if (value.length() > 6) {
            value = value.replaceFirst("(\\d{1,3})(\\d{3})(\\d{3})", "$1\u00B4$2,$3");
        } else if (value.length() >=5 && value.length() <= 6) {
            value = value.replaceFirst("(\\d{2,3})(\\d{3})", "$1,$2");
        }  else {
            value = value.replaceFirst("(\\d{1})(\\d+)", "$1,$2");
        }

    return value;
} 

我不知道这个解决方案是否会影响性能,而且我对正则表达式很陌生,所以这段代码可能可以更简短。

-1
也许可以尝试使用这个,在空格或逗号之前用所需的单位替换“#”。
String num = "1000500000.574";
    String newnew = new   DecimalFormat("#,###.##").format(Double.parseDouble(number));

OP明确表示DecimalFormat无法工作。 - walen
谢谢@TiagoFutre,但是这种格式在我的特定情况下不起作用。 - Donald Fernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接