2013-03-10 6 views
8

私は3桁のグループ間でカンマを追加するために、文字列をフォーマットしようとしている小数を変更せずにカンマ(区切り記号)を数値に追加しますか?

EG:

1200.20 >> 1,200.20 
15000 >> 15,000 

私は私がされているこの時点まで、のDecimalFormatでそれを行う方法を把握しようとしています私自身のスクリプトを使用すると、あまりにも複雑に思えます。私はそれを行う方法を理解することはできません。#を使うと後続のゼロを隠すだけで、0を使うと数値に加算されます。

これは私が今しようとしているものです:

DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US)); 
resultStr = df.format(Double.valueOf(resultStr)); 

私はそれが簡単でなければならないと確信しているが、私はそれを行うかどうかはわかりません。私はDecimalFormatでそれを行う必要はありません、私はちょうどそれがより簡単な方法だろうと思った。どのように小数を変更せずにコンマを追加するだけですか?

答えて

14

NumberFormatオブジェクトを使用し、グループ化を使用するように設定する必要があります。

11,220 
232,323,232.24 
121,211.55 
102.121 

11,220.00 
232,323,232.24 
121,211.55 
102.12 

For Germany 
11.220,00 
232.323.232,24 
121.211,55 
102,12 

For US: 
11,220.00 
232,323,232.24 
121,211.55 
102.12 

をこの方法の利点は、溶液は、ロケール固有なものにすることができるということです。返し

import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.util.Locale; 

public class NumberFormatEg { 
    public static void main(String[] args) { 
     NumberFormat myFormat = NumberFormat.getInstance(); 
     myFormat.setGroupingUsed(true); 

     double[] numbers = { 11220.00, 232323232.24, 121211.55, 102.121212 }; 

     for (double d : numbers) { 
     System.out.println(myFormat.format(d)); 
     } 
     System.out.println(); 

     DecimalFormat decimalFormat = new DecimalFormat("#.00"); 
     decimalFormat.setGroupingUsed(true); 
     decimalFormat.setGroupingSize(3); 

     for (double d : numbers) { 
     System.out.println(decimalFormat.format(d)); 
     } 

     System.out.println("\nFor Germany"); 

     NumberFormat anotherFormat = NumberFormat 
      .getNumberInstance(Locale.GERMAN); 
     if (anotherFormat instanceof DecimalFormat) { 
     DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat; 
     anotherDFormat.applyPattern("#.00"); 
     anotherDFormat.setGroupingUsed(true); 
     anotherDFormat.setGroupingSize(3); 

     for (double d : numbers) { 
      System.out.println(anotherDFormat.format(d)); 
     } 

     } 

     System.out.println("\nFor US:"); 

     anotherFormat = NumberFormat.getNumberInstance(Locale.US); 
     if (anotherFormat instanceof DecimalFormat) { 
     DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat; 
     anotherDFormat.applyPattern("#.00"); 
     anotherDFormat.setGroupingUsed(true); 
     anotherDFormat.setGroupingSize(3); 

     for (double d : numbers) { 
      System.out.println(anotherDFormat.format(d)); 
     } 

     } 
    } 
} 

ような何か。

編集
ここでは、DecimalFormatオブジェクトの例を示します。これを使用する場合は、グループ化サイズを設定する必要があることに注意してください。あなたが正確に何をしたい行うことができるはず

+0

'DecimalFormat'を実際に生成されたセパレータを使用***' NumberFormat' –

+0

@a_horse_with_no_nameです:true、彼はDecimalFormatオブジェクトに対して 'setGroupingUsed(true)'を呼び出すことができます。 –

+0

私はdecimalformatでコードを使用しました。ただし、 '。'を使用します。グループのカンマではなくどうすれば '、'、またはLocale.USに変更できますか? – lisovaccaro

10

また、私はのいずれかを作ることができなかった

DecimalFormat df = new DecimalFormat("#,###.00"); 

System.out.println(df.format(1200.20)); 
System.out.println(df.format(15000)); 
System.out.println(df.format(123456789.99)); 
 
1,200.20 
15,000.00 
123,456,789.99 
+0

'setGroupingUsed(true)'と 'setGroupingSize(3)'を呼び出す方が良いでしょう。そうしないと、あなたの解は999999.00を超える数値に対しては機能しません。 –

+0

@HovercraftFullOfEelsこのような数字に対してうまくいくと思われます。 '9999999.00' - >' 9,999,999.00'です。 – arshajii

+0

私は私が言ったことを取り下げる。 1 +その日の最後の投票です。 : –

1

ような何かを試すことができます他の解決策は動作し、小数点以下は四捨五入され、後にはゼロが追加され、後にはゼロが削除されます。

私は自分の答えを受け入れるつもりはありませんが、誰かが役に立つと思った場合に備えてスクリプトを投稿します。

public void(String str) { 
    int floatPos = str.indexOf(".") > -1 ? str.length() - str.indexOf(".") : 0; 
    int nGroups= (str.length()-floatPos-1-(str.indexOf("-")>-1?1:0))/3; 
    for(int i=0; i<nGroups; i++){ 
     int commaPos = str.length() - i * 4 - 3 - floatPos; 
    str = str.substring(0,commaPos) + "," + str.substring(commaPos,str.length()); 
    } 
    return str; 
} 


1    => 1 
1.0   => 1.0 
1234.01  => 1,234.01 
1100100.12345 => 1,100,100.12345 
0

最も簡単な解決策あなたはprintfcomma , flagを使用していないのはなぜ

System.out.printf("%,d\n", 58625);// the d to accept decimal integer 
System.out.printf("%,.2f", 12345678.9);// the f to accept folouting point and 2 to take only 2 digits 

出力は

58,625 
12,345,678.90 

そして、良いニュースます:is specific to the user’s locale

関連する問題