2011-05-04 81 views
106

我收到一個帶有6位數字的int。我想從int的末尾以2位數的小數點(。)將它顯示爲String。我想使用float,但建議使用String以獲得更好的顯示輸出(而不是1234.5將會是1234.50)。因此,我需要一個函數,它將採用int作爲參數,並從最後返回格式正確的String,小數點後兩位數。在一個字符串中插入一個字符在某個位置

說:

int j= 123456 
Integer.toString(j); 

//processing... 

//output : 1234.56 

回答

134
int j = 123456; 
String x = Integer.toString(j); 
x = x.substring(0, 4) + "." + x.substring(4, x.length()); 
+5

字符串是不可變的。雖然這可行,但使用類似StringBuilder的東西在道義上是正確的,更不用說會讓你的代碼更快。 – wheresmycookie 2013-07-20 19:39:33

+7

忘記StringBuilder。通過格式化,[String.format](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format%28java.lang.String,%20java.lang .Object ...%29)是可用的最佳選項。 – NobleUplift 2013-07-24 16:06:37

+19

沒有循環,這是一個簡單的連接情況,編譯器應該使用字符串生成器對其進行優化,爲了便於閱讀,我傾向於使用+運算符,在這種情況下不需要顯式使用StringBuilder。使用「StringBuilder」解決方案,因爲它更快速,不尊重優化規則。代碼的可讀性。在分析後進行優化,只在需要時進行優化。 http://en.wikipedia.org/wiki/Program_optimization#Quotes – 2013-10-07 20:06:08

15
int your_integer = 123450; 
String s = String.format("%6.2f", your_integer/100.0); 
System.out.println(s); 
+0

我建議使用'java.math.BigDecimal'作爲使用'double'會導致[舍入錯誤](http://stackoverflow.com/questions/177506/why-do-i-see-a-double-variable-初始化到一些值樣21-4-AS-21-3999996)。如果速度比精度更有價值,那麼「double」更好。 – sotrh 2014-10-17 20:46:45

3

你可以使用

System.out.printf("%4.2f%n", ((float)12345)/100)); 

按照該意見,12345/100.0會更好,因爲會使用雙,而不是浮動。

+1

'double'可能是更好的選擇。浮點數只能精確到6位數。 – 2011-05-04 14:10:53

+1

是的,另一個有人迴應的例子是使用12345/100.0,這是更聰明(雖然它結果與同樣的結果。) – 2011-05-04 14:11:56

+0

Nitpicking:我認爲這不會給出正確的結果,因爲12345/100 = 123 in整數並且僅在之後被轉換爲123.00。 ((float)12345/100)會起作用。 – rurouni 2011-05-05 13:20:33

0

如果您正在使用的系統中浮動價格昂貴(如無FPU)或不允許(如會計),你可以使用這樣的事情:

for (int i = 1; i < 100000; i *= 2) { 
     String s = "00" + i; 
     System.out.println(s.substring(Math.min(2, s.length() - 2), s.length() - 2) + "." + s.substring(s.length() - 2)); 
    } 

否則DecimalFormat的是更好的解決方案。 (StringBuilder的變種上面不會有小的數字(< 100)

+2

在會計的情況下,您最好用BigDecimal。 – 2011-05-04 14:07:06

+0

@約瑟夫:你說得對。我不是會計,我大多使用整數作爲性能原因的固定點表示(在嵌入式java中),所以BigDecimal不是我的選擇;-) – rurouni 2011-05-04 14:35:35

163

工作正如評論所說,一個StringBuilder可能是一個更快的實現則使用StringBuffer正如Java文檔中提到:

這個類提供了一個與StringBuffer兼容的API,但沒有同步保證,這個類被設計爲在單個線程正在使用字符串緩衝區的地方,用作StringBuffer的嵌入替代品(通常情況下) 。在可能的情況下,建議將此類優先用於StringBuffer,因爲在大多數實現中它的速度會更快。

用法:

String str = Integer.toString(j); 
str = new StringBuilder(str).insert(str.length()-2, ".").toString(); 

或者,如果你需要用類似的使用同步使用StringBuffer

String str = Integer.toString(j); 
str = new StringBuffer(str).insert(str.length()-2, ".").toString(); 
+2

這個答案應該可以編輯爲使用StringBuilder – Snekse 2013-06-04 14:06:36

+0

@Snekse非常好點。已經編輯了你的建議答案。 – blo0p3r 2013-06-04 15:04:57

+4

這應該標記爲正確的答案。 – calbertts 2014-02-18 02:52:54

0
public static void main(String[] args) { 
    char ch='m'; 
    String str="Hello",k=String.valueOf(ch),b,c; 

    System.out.println(str); 

    int index=3; 
    b=str.substring(0,index-1); 
    c=str.substring(index-1,str.length()); 
    str=b+k+c; 
} 
0

在大多數使用情況,使用StringBuilder(如已回答)是做這件事的好方法。但是,如果表現很重要,這可能是一個很好的選擇。

/** 
* Insert the 'insert' String at the index 'position' into the 'target' String. 
* 
* ```` 
* insertAt("AC", 0, "") -> "AC" 
* insertAt("AC", 1, "xxx") -> "AxxxC" 
* insertAt("AB", 2, "C") -> "ABC 
* ```` 
*/ 
public static String insertAt(final String target, final int position, final String insert) { 
    final int targetLen = target.length(); 
    if (position < 0 || position > targetLen) { 
     throw new IllegalArgumentException("position=" + position); 
    } 
    if (insert.isEmpty()) { 
     return target; 
    } 
    if (position == 0) { 
     return insert.concat(target); 
    } else if (position == targetLen) { 
     return target.concat(insert); 
    } 
    final int insertLen = insert.length(); 
    final char[] buffer = new char[targetLen + insertLen]; 
    target.getChars(0, position, buffer, 0); 
    insert.getChars(0, insertLen, buffer, position); 
    target.getChars(position, targetLen, buffer, position + insertLen); 
    return new String(buffer); 
} 
0

我認爲一個更簡單,更優雅的解決方案中插入一個特定位置上的字符串會是這樣的一行:

target.replaceAll("^(.{" + position + "})", "$1" + insert); 

例如,插入缺失:爲時間字符串:

"-0300".replaceAll("^(.{3})", "$1:"); 

它是什麼,匹配從字符串的開頭position人物,團體認爲,與自身替換組($1),然後是insert字符串。注意replaceAll,即使總是有一次發生,因爲第一個參數必須是正則表達式。

當然,它並不具備與StringBuilder解決方案相同的性能,但我相信簡潔和優雅作爲一個簡單且易於閱讀的單行(與巨大方法相比)足以使其成爲首選解決方案在大多數非性能關鍵用例中。

注意我正在解決標題中的通用問題,因爲文檔原因,當然如果您要處理十進制數字,則應該使用已經提出的特定於域的解決方案。

相關問題