2011-08-04 12 views
5

通常のゼロではなく、Javaでアンダースコアを使用する方法は?例えばJavaでアンダースコアを使用する方法

私は

  • 123.45が_にフォーマットされるために_12345.67
  • 0.12にフォーマットされるために123.45と
  • 12345.67を___ためにフォーマットされたい __ _ __ .12

私はたくさんのものを試しました。 (SYMBOLS.setZeroDigit( '_')を使用することによって;)これは:

import java.text.DecimalFormat; 
import java.text.DecimalFormatSymbols; 

public class Example { 

    public static void main(String[] args) { 
     DecimalFormatSymbols SYMBOLS = new DecimalFormatSymbols(); 
     SYMBOLS.setDecimalSeparator('.'); 
     SYMBOLS.setGroupingSeparator(','); 
     DecimalFormat OUTPUT_FORMAT = new DecimalFormat("000,000.00", SYMBOLS); 

     System.out.println(OUTPUT_FORMAT.format(0.01)); 
     // got 000,000.01 
     System.out.println(OUTPUT_FORMAT.format(0.12)); 
     // got 000,000.12 
     System.out.println(OUTPUT_FORMAT.format(123456)); 
     // got 123,456.00 
     System.out.println(OUTPUT_FORMAT.format(123456.78)); 
     // got 123,456.78 
     System.out.println(OUTPUT_FORMAT.format(1234)); 
     // got 001,234.00 
     System.out.println(OUTPUT_FORMAT.format(1234.56)); 
     // got 001,234.56 

     SYMBOLS.setZeroDigit('_'); 
     OUTPUT_FORMAT = new DecimalFormat("000,000.00", SYMBOLS); 
     System.out.println(OUTPUT_FORMAT.format(0.01)); 
     // expected ______._1 but got ___,___._` 
     System.out.println(OUTPUT_FORMAT.format(0.12)); 
     // expected ______.12 but got ___,___.`a 
     System.out.println(OUTPUT_FORMAT.format(123456)); 
     // expected 123,456.__ but got `ab,cde.__ 
     System.out.println(OUTPUT_FORMAT.format(123456.78)); 
     // expected 123,456.78 but got `ab,cde.fg 
     System.out.println(OUTPUT_FORMAT.format(1234)); 
     // expected __1,234.00 or at least __1,234.__ but got __`,abc.__ 
     System.out.println(OUTPUT_FORMAT.format(1234.56)); 
     // expected __1,234.56 but got __`,abc.de 
    } 

} 

まあ、本当に近いが、空の番号(末尾のアンダースコア付き)フォーマットされ、右の場合: _ __ _ __。とにかく

__ 、期待される動作を取得する方法についての提案ですか? num

+0

'DecimalFormatSymbols.setZeroDigit'は、文字をゼロ**とそれに続く他のすべての数字に設定するために使用されます**。 '_'の後に' ___、___._ 'の代わりに' ___、___._ ''が表示されている理由です。編集:書式設定は機能しませんが、私が推測するポイントを得ます。 –

+0

はい、私はsetZeroDigitの仕組みを知っていますが、期待通りの回避策を求めていました – Belun

答えて

6
"_________".substring(num.length())+num; 

はあなたの番号を保持Stringです。 doubleStringに変換するには、Double.toString(myDouble)を使用します。

+1

残念ながら、 'Double.toString(myDouble)'は '123,456.78'の代わりに' 123456.78'を返します – OscarRyz

3

Apache CommonsライブラリのStringUtils.leftPad()メソッドを使用できます。

// pad to 10 chars 
String padded = StringUtils.leftPad("123.456", 10, '_'); 
// padded will be equal to "___123.456" 
+1

______._ 1 ? – Belun

+1

@Belunあなたが正しいです、尋問者の要件を達成する唯一の方法は、ユーザーメソッドを開発することです。 – Marcelo

1

ダdaaa

import java.text.DecimalFormat; 

class F { 
    public static void main(String ... args) { 
    DecimalFormat f = new DecimalFormat("000,000.00"); 
    for(double d : new double[]{ 0.01, 0.12, 123456, 123456.78, 1234, 1234.56 }){ 
     System.out.println( 
     f.format(d).replaceAll("0","_").replaceAll("_,_","__") 
    ); 
    } 
    } 
} 

出力:

______._1 
______.12 
123,456.__ 
123,456.78 
__1,234.__ 
__1,234.56 

おそらく交換は1つのステップで行うことができるが、私はあなたにそれをもらおう。

+2

これは '1230.45'や' 1234.05'のような数字では機能しません。 – Marcelo

+0

私はMarceloについてよく分かりません。たとえば、OPは '______。01'ではなく' 0.01 'に対して '_____._1'を期待しています。元の質問から私は* "期待された*" *をとり、アサーションでテストしました。ここを見てください:https://gist.github.com/1125723したがって、OPの期待通りに、このコードは必要なことを行います。 – OscarRyz

関連する問題