Java货币编号格式

时间:2010-03-04 12:33:03

标签: java currency number-formatting

有没有办法将小数格式化为:

100   -> "100"  
100.1 -> "100.10"

如果是圆数,则省略小数部分。否则用两位小数格式化。

22 个答案:

答案 0 :(得分:143)

我建议使用java.text包:

double money = 100.1;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
String moneyString = formatter.format(money);
System.out.println(moneyString);

这具有特定于语言环境的额外好处。

但是,如果必须的话,截断你得到的字符串,如果它是一整块钱:

if (moneyString.endsWith(".00")) {
    int centsIndex = moneyString.lastIndexOf(".00");
    if (centsIndex != -1) {
        moneyString = moneyString.substring(1, centsIndex);
    }
}

答案 1 :(得分:97)

double amount =200.0;
Locale locale = new Locale("en", "US");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));

double amount =200.0;
System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US"))
        .format(amount));
  

显示货币的最佳方式

输出

  

$ 200.00

如果您不想使用sign,请使用此方法

double amount = 200;
DecimalFormat twoPlaces = new DecimalFormat("0.00");
System.out.println(twoPlaces.format(amount));
  

200.00

     

这也可以使用(千分隔符)

double amount = 2000000;    
System.out.println(String.format("%,.2f", amount));          
  

2,000,000.00

答案 2 :(得分:42)

我对此表示怀疑。问题是如果它是浮点数100则永远不是100,它通常是99.9999999999或100.0000001或类似的东西。

如果你想以这种方式格式化,你必须定义一个epsilon,即与整数之间的最大距离,如果差异较小则使用整数格式,否则使用浮点数。

这样的事情可以解决问题:

public String formatDecimal(float number) {
  float epsilon = 0.004f; // 4 tenths of a cent
  if (Math.abs(Math.round(number) - number) < epsilon) {
     return String.format("%10.0f", number); // sdb
  } else {
     return String.format("%10.2f", number); // dj_segfault
  }
}

答案 3 :(得分:16)

谷歌搜索后我没有找到任何好的解决方案,只是发布我的解决方案供其他人参考。使用 priceToString 格式化资金。

public static String priceWithDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.00");
    return formatter.format(price);
}

public static String priceWithoutDecimal (Double price) {
    DecimalFormat formatter = new DecimalFormat("###,###,###.##");
    return formatter.format(price);
}

public static String priceToString(Double price) {
    String toShow = priceWithoutDecimal(price);
    if (toShow.indexOf(".") > 0) {
        return priceWithDecimal(price);
    } else {
        return priceWithoutDecimal(price);
    }
}

答案 4 :(得分:6)

我正在使用这个(使用来自commons-lang的StringUtils):

Double qty = 1.01;
String res = String.format(Locale.GERMANY, "%.2f", qty);
String fmt = StringUtils.removeEnd(res, ",00");

您只需要处理区域设置和相应的字符串即可。

答案 5 :(得分:6)

是。您可以使用java.util.formatter。您可以使用格式化字符串,如“%10.2f”

答案 6 :(得分:5)

我们通常需要做反向,如果你的json money字段是浮点数,它可能会是3.1,3.15或只是3.

在这种情况下,您可能需要对其进行舍入以便正确显示(并且以后可以在输入字段上使用遮罩):

User

答案 7 :(得分:5)

NumberFormat currency = NumberFormat.getCurrencyInstance();
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);

输出:

$123.50

如果您想更改币种,

NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.CHINA);
String myCurrency = currency.format(123.5);
System.out.println(myCurrency);

输出:

¥123.50

答案 8 :(得分:5)

我认为打印货币很简单明了:

DecimalFormat df = new DecimalFormat("$###,###.##"); // or pattern "###,###.##$"
System.out.println(df.format(12345.678));

输出:$ 12,345.68

该问题的可能解决方案之一:

public static void twoDecimalsOrOmit(double d) {
    System.out.println(new DecimalFormat(d%1 == 0 ? "###.##" : "###.00").format(d));
}

twoDecimalsOrOmit((double) 100);
twoDecimalsOrOmit(100.1);

输出:

100

100.10

答案 9 :(得分:4)

你应该这样做:

public static void main(String[] args) {
    double d1 = 100d;
    double d2 = 100.1d;
    print(d1);
    print(d2);
}

private static void print(double d) {
    String s = null;
    if (Math.round(d) != d) {
        s = String.format("%.2f", d);
    } else {
        s = String.format("%.0f", d);
    }
    System.out.println(s);
}

打印:

100

100,10

答案 10 :(得分:4)

这是最好的方法。

    public static String formatCurrency(String amount) {
        DecimalFormat formatter = new DecimalFormat("###,###,##0.00");
        return formatter.format(Double.parseDouble(amount));
    }

100 - &gt; “100.00”
100.1 - &gt; “100.10”

答案 11 :(得分:4)

我同意@duffymo你需要使用java.text.NumberFormat方法来做这类事情。实际上你可以在其中进行原生的所有格式化,而无需对自己进行任何String比较:

private String formatPrice(final double priceAsDouble) 
{
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    if (Math.round(priceAsDouble * 100) % 100 == 0) {
        formatter.setMaximumFractionDigits(0);
    }
    return formatter.format(priceAsDouble);
}

指出要点:

  • 整个Math.round(priceAsDouble * 100) % 100只是解决双打/浮点数的不准确问题。基本上只是检查我们是否到了数百个地方(也许这是美国的偏见)还有剩余的分数。
  • 删除小数的技巧是setMaximumFractionDigits()方法

无论您确定是否应截断小数的逻辑,都应使用setMaximumFractionDigits()

答案 12 :(得分:4)

你可以做这样的事情并传递整数,然后传递美分。

String.format("$%,d.%02d",wholeNum,change);

答案 13 :(得分:4)

我知道这是一个老问题,但是......

import java.text.*;

public class FormatCurrency
{
    public static void main(String[] args)
    {
        double price = 123.4567;
        DecimalFormat df = new DecimalFormat("#.##");
        System.out.print(df.format(price));
    }
}

答案 14 :(得分:3)

格式从1000000.2到1 000 000,20

private static final DecimalFormat DF = new DecimalFormat();

public static String toCurrency(Double d) {
    if (d == null || "".equals(d) || "NaN".equals(d)) {
        return " - ";
    }
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
    DecimalFormatSymbols symbols = DF.getDecimalFormatSymbols();
    symbols.setGroupingSeparator(' ');
    String ret = DF.format(bd) + "";
    if (ret.indexOf(",") == -1) {
        ret += ",00";
    }
    if (ret.split(",")[1].length() != 2) {
        ret += "0";
    }
    return ret;
}

答案 15 :(得分:3)

如果您想要使用货币,则必须使用BigDecimal类。问题是,没有办法在内存中存储一​​些浮点数(例如,你可以存储5.3456,但不能存储5.3455),这可能会影响计算错误。

有一篇很好的文章如何与BigDecimal和货币合作:

http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html

答案 16 :(得分:2)

这篇文章真的帮助我终于得到了我想要的东西。所以我只是想在这里贡献我的代码来帮助别人。这是我的代码,有一些解释。

以下代码:

double moneyWithDecimals = 5.50;
double moneyNoDecimals = 5.00;
System.out.println(jeroensFormat(moneyWithDecimals));
System.out.println(jeroensFormat(moneyNoDecimals));

将返回:

€ 5,-
€ 5,50

实际的jeroensFormat()方法:

public String jeroensFormat(double money)//Wants to receive value of type double
{
        NumberFormat dutchFormat = NumberFormat.getCurrencyInstance();
        money = money;
        String twoDecimals = dutchFormat.format(money); //Format to string
        if(tweeDecimalen.matches(".*[.]...[,]00$")){
            String zeroDecimals = twoDecimals.substring(0, twoDecimals.length() -3);
                return zeroDecimals;
        }
        if(twoDecimals.endsWith(",00")){
            String zeroDecimals = String.format("€ %.0f,-", money);
            return zeroDecimals; //Return with ,00 replaced to ,-
        }
        else{ //If endsWith != ,00 the actual twoDecimals string can be returned
            return twoDecimals;
        }
}

调用方法jeroensFormat()

的方法displayJeroensFormat
    public void displayJeroensFormat()//@parameter double:
    {
        System.out.println(jeroensFormat(10.5)); //Example for two decimals
        System.out.println(jeroensFormat(10.95)); //Example for two decimals
        System.out.println(jeroensFormat(10.00)); //Example for zero decimals
        System.out.println(jeroensFormat(100.000)); //Example for zero decimals
    }

将具有以下输出:

€ 10,50
€ 10,95
€ 10,-
€ 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-)

此代码使用您当前的货币。在我的情况下,这是荷兰所以我的格式化字符串将与美国某些人不同。

  • Holland:999.999,99
  • 美国:999,999.99

只需观看这些数字的最后3个字符。我的代码有一个if语句来检查最后3个字符是否等于“,00”。要在美国使用它,如果它不起作用,您可能必须将其更改为“.00”。

答案 17 :(得分:2)

我疯狂到写自己的功能:

这会将整数转换为货币格式(也可以修改为小数):

 String getCurrencyFormat(int v){
        String toReturn = "";
        String s =  String.valueOf(v);
        int length = s.length();
        for(int i = length; i >0 ; --i){
            toReturn += s.charAt(i - 1);
            if((i - length - 1) % 3 == 0 && i != 1) toReturn += ',';
        }
        return "$" + new StringBuilder(toReturn).reverse().toString();
    }

答案 18 :(得分:1)

  public static String formatPrice(double value) {
        DecimalFormat formatter;
        if (value<=99999)
          formatter = new DecimalFormat("###,###,##0.00");
        else
            formatter = new DecimalFormat("#,##,##,###.00");

        return formatter.format(value);
    }

答案 19 :(得分:1)

这就是我所做的,使用整数来代表以美分为单位的金额:

public static String format(int moneyInCents) {
    String format;
    Number value;
    if (moneyInCents % 100 == 0) {
        format = "%d";
        value = moneyInCents / 100;
    } else {
        format = "%.2f";
        value = moneyInCents / 100.0;
    }
    return String.format(Locale.US, format, value);
}

NumberFormat.getCurrencyInstance()的问题在于,有时你真的希望20美元成为20美元,它看起来好于20.00美元。

如果有人找到更好的方法,使用NumberFormat,我会全力以赴。

答案 20 :(得分:0)

对于想要格式化货币但又不想基于本地货币的人,我们可以这样做:

CREATE TABLE myTable (
    user_id INT,
    message TEXT,
    modified DATE,
    PRIMARY KEY ((user_id), modified)
)
WITH CLUSTERING ORDER BY (modified DESC);

答案 21 :(得分:0)

double amount = 200.0;

NumberFormat Us = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println(Us.format(amount));

输出
$200.00