有没有办法将小数格式化为:
100 -> "100"
100.1 -> "100.10"
如果是圆数,则省略小数部分。否则用两位小数格式化。
答案 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 ,-)
此代码使用您当前的货币。在我的情况下,这是荷兰所以我的格式化字符串将与美国某些人不同。
只需观看这些数字的最后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