2011-08-04 28 views
5

Làm thế nào để số pad với dấu gạch dưới trong Java, thay vì số không bình thường?Làm cách nào để dán số bằng dấu gạch dưới trong Java?

Ví dụ tôi muốn

  • 123,45 được formated để ___ 123,45 và
  • 12345,67 được formated để _12345.67
  • 0.12 được formated để _ __ _ __ .12

Tôi đã thử rất nhiều thứ và gần nhất tôi có là này (bằng cách sử dụng 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 
    } 

} 

Vâng, không thực sự gần gũi nhưng một số sản phẩm nào nếu đúng formated (với dấu gạch trailing): _ __ ,_ __. __

Dù sao, đề xuất về cách nhận được hành vi mong muốn?

+0

'DecimalFormatSymbols.setZeroDigit' được sử dụng để đặt ký tự đại diện cho số không ** và tất cả các chữ số khác theo sau **. 'sau' _' và đó là lý do tại sao bạn thấy '___, ___._' 'thay vì' ___, ___._ 1' Chỉnh sửa: định dạng không hoạt động nhưng bạn nhận được điểm tôi giả sử. –

+0

vâng, tôi biết setZeroDigit hoạt động như thế nào nhưng tôi đã yêu cầu giải pháp để đạt được mong đợi – Belun

Trả lời

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

nơi num là số String giữ số của bạn. Để chuyển đổi số double thành String, bạn có thể sử dụng Double.toString(myDouble).

+1

Thật không may 'Double.toString (myDouble)' sản lượng '123456.78' thay vì' 123,456.78' – OscarRyz

3

Bạn có thể sử dụng phương thức StringUtils.leftPad() từ thư viện Apache Commons.

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

khoảng 0,01 người nên được độn vào ______._ 1 ? – Belun

+1

@Belun Bạn nói đúng, cách duy nhất để đạt được yêu cầu của người hỏi là phát triển một phương pháp người dùng. – 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("_,_","__") 
    ); 
    } 
    } 
} 

Output:

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

Có lẽ việc thay đổi có thể được thực hiện trong một bước nhưng tôi sẽ để điều đó cho bạn.

+2

Điều này sẽ không hoạt động với các số như '1230.45' hoặc' 1234.05' – Marcelo

+0

Tôi không chắc chắn Marcelo, OP ví dụ dự kiến ​​'_____._ 1' cho' 0,01' và không phải '______. 01'. Từ câu hỏi ban đầu tôi lấy * "mong đợi ..." * và kiểm tra nó với các xác nhận. Hãy xem tại đây: https://gist.github.com/1125723 Vì vậy, theo mong đợi của OP, mã này thực hiện những gì cần thiết. – OscarRyz

Các vấn đề liên quan