2015-05-17 62 views
2

我想改變以下輸出如何打印小數位,直到沒有兩個重複零點?

5250.000000000000 
5512.500000000000 
5788.125000000001 
6077.531250000001 
6381.407812500002 
6700.478203125002 
7035.502113281253 
7387.277218945315 
7756.641079892581 
8144.47313388721  

爲了下面的輸出。

5250.0 
5512.5 
5788.125 
6077.53125 
6381.4078125 
6700.478203125 
7035.50211328125 
7387.277218945313 
7756.641079892578 
8144.473133887207 

所以看起來我需要的邏輯,是隻打印小數位,如果有小於兩個小數位重複0。我假設printf可以處理這個,但如果我真的知道,我不會問。

+1

您使用哪種數據類型來表示內存中的這些十進制數? 'double','float','BigDecimal'或'String'? – isnot2bad

+0

對不起。雙打或浮動 – user136952

+1

也許你可以使用regexps(http://www.vogella.com/tutorials/JavaRegularExpressions/article.html)來消除這種模式後面的子字符串:r'0 * 1?$'。我輸入這個假設你先把數字轉換成字符串。 – SebasSBM

回答

2

要麼我誤讀了這個問題,要麼在我輸入的時候改變了,我的原始答案暗示了DecimalFormat不會做你想要的。正則表達式會:

final String unformatted = Double.toString(6381.407812500002); 
final String formatted = unformatted.replaceAll("00+\\d*$", ""); 
System.out.println(formatted); 

產量:6381.4078125

你問任何兩個以上的零和所有數字後,它們將被替換,所以這個匹配00後跟任意數字(不匹配.所以這將只在小數點後修剪)並將其擦除。


原來的答覆:

答案几乎所有的數字格式的需求就是DecimalFormat的(Javadoc中)。特別是這種情況:

NumberFormat formatter = new DecimalFormat("0.###########"); 
System.out.println(formatter.format(5788.125000000001)); 

產量:5788.125

在這種情況下,我指定了至小數點後11位,比這更會進行四捨五入,並使用#(而不是0小數點後地方)告訴它不要在該位置顯示尾隨0。

+0

你的例子幾乎是完美的。我們在一臺'5250.0'上打印了'5250'。我把我的代碼從'NumberFormat formatter = new DecimalFormat(「0。###########」);'改爲'NumberFormat formatter = new DecimalFormat(「.0 ######### ##「);'那就是訣竅。我不能投票,但如果可以的話,我會投票。謝謝! – user136952

+0

我編輯了NullSoulException的答案,實現了您需要的完美正則表達式。它不會出現,直到它的同行評審。如果1337joe同意,我也會建議他使用相同的模式版本。 – SebasSBM

+0

你建議'0+ [1-9]?$',它匹配零後跟一個數字。問題是「我怎樣才能打印小數位...... [沒有]兩個重複的零?」,它沒有提到最後只有一個非零數字(儘管這就是樣本數字)。我的正則表達式會將'1.10012'截斷爲'1.1',您的匹配或替換任何東西都不會。 – 1337joe

1

一種方法是構造一個regex,它將從給定的字符串中刪除不需要的尾部零。像下面的東西會爲你做。只要將這個正則表達式放在正在讀取文件的循環中即可。

// The 1-9 group would erase the last trailing 
    // non-zero digit, as suggested by the example 
    somevariable = str.replaceAll("0+[1-9]?$", ""); 
+0

那個正則表達式不會在尾部零之前擦除第一個數字嗎?我會建議編輯。請檢查一下。 – SebasSBM

+1

我測試了建議的正則表達式。它工作正常。 – SebasSBM

+1

謝謝@SebasSBM – zee

1

下面是你是如何做到的。我正在使用double,但你也可以對float進行同樣的操作。

double doubleValue = 1001.10210010138200321; 
String doubleString = Double.toString(doubleValue); 
String[] part = doubleString.split("\\."); 
String decimalPart = part[1].substring(0, part[1].indexOf("00")); 
String trimmedDoubleString = part[0] + "." + decimalPart; 
double trimmedDouble = Double.parseDouble(trimmedDoubleString); 
相關問題