我需要一種格式數字的方法。我在我的數據庫表中存儲了一些數字,例如12500
,並且希望以這種格式打印它們12 500
(因此每3位數字有一個空格)。有沒有一個優雅的方式來做到這一點?如何將數字1000的格式設置爲「1 000」
回答
見:http://www.justskins.com/forums/format-number-with-comma-37369.html
沒有內置的方式(除非你使用Rails,的ActiveSupport是否有方法來做到這一點),但你可以使用正則表達式像
formatted_n = n.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
,將增加逗號,而不是空格順便說一句 – loosecannon
只需用空格代替號(' \&,'用'\&'),它會起作用。 –
謝謝你們的快速幫助。但是,說實話,我認爲這存在一些更好的方式(例如PHP中的[this function](http://php.net/manual/en/function.number-format.php))。但我怎麼說,感謝解決方案! – user1946705
所以,這是很瘋狂和hackish的,但它能夠完成任務......
12500.to_s.split("").reverse.each_slice(3).map {|y| y.join("").reverse}.reverse.join(" ")
=> "12 500"
.to_s: convert to string
.split(""): split into separate digits
.reverse: reverse order
.each_slice(3): peel of each three digits (working from back end due to reverse)
.map {|y| y.join("").reverse}: map into an array for each three digits - join back together with no delimiter and reverse order back to original
.reverse: reverse order of mapped array
.join(" "): join mapped array back together with space delimiter
這是聰明的使用'each_slice'來避免多餘的正則表達式 –
另一種方式:
12500.to_s.reverse().split(//).inject() {|x,i| (x.gsub(/ /,"").length % 3 == 0) ? x + " " + i : x + i}.reverse()
您可以隨時打開類長整數,並添加此爲了方便:
module FormatNums
def spaceify
self.to_s.reverse().split(//).inject() {|x,i| (x.gsub(/ /,"").length % 3 == 0) ? x + " " + i : x + i}.reverse()
end
end
class Fixnum
include FormatNums
end
12500.spaceify # => "12 500"
的ActiveSupport使用這個正則表達式(並沒有反向反向)。
10000000.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1 ") #=> "10 000 000"
我會打開Integer類並添加一個方法。這抓住了Fixnum和Bignum。 –
這很好。用/(\ d)(?=(\ d \ d \ d)+ $)/'來消除負面預測嗎? –
的official document表明三種不同的方法:
1)使用回顧後和先行(需要oniguruma)
12500.to_s.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ' ')
# => "12 500"
2)僅使用先行。與steenslag的答案完全相同。
3)使用既不超前,也不回顧後
s = 12500.to_s
nil while s.sub!(/(.*\d)(\d{3})/, '\1 \2')
s # => "12 500"
#3似乎依賴於貪婪。如果是這樣,我認爲如果使用'gsub!'或'sub!'就沒有關係。 'nil'可以被任何文字取代。正確?這總是等於'while s.gsub!(/(。* \ d)(\ d {3})/,'\ 1 \ 2'); (我認爲讀得更好一些)? –
@CarySwoveland是的。 'gsub!'是不必要的。我編輯過。 – sawa
我知道這是一個老問題,但。
爲什麼不只是使用子串替換。
在僞代碼....
String numberAsString = convertNumberToString(123456);
int numLength = V.length;//determine length of string
String separatedWithSpaces = null;
for(int i=1; i<=numlength; i++){//loop over the number
separatedWithSpaces += numberAsString.getCharacterAtPosition(i);
if(i.mod(3)){//test to see if i when devided by 3 in an integer modulo,
separatedWithSpaces += " ";
}//end if
}//end loop
我知道這是不是在任何特定的語,但希望你的想法。
大衛
我認爲正則表達式是解決這個問題的最好和最乾淨的方式。這聽起來太複雜了。 –
這裏是一個相當簡潔明瞭,如果你正在處理的整數另一種方法:
number.to_s.reverse.scan(/\d{1,3}/).join(",").reverse
number #=> 12345678
.to_s #=> "12345678"
.reverse #=> "87654321"
.scan(/\d{1,3}/) #=> ["876","543","21"]
.join(",") #=> "876,543,21"
.reverse #=> "12,345,678"
的整數的偉大工程。當然,這個特定的例子將用逗號分隔數字,但切換到空格或任何其他分隔符就像替換join
方法中的參數一樣簡單。
這是舊的,但我能找到這樣做的最快和最優雅的方式是:
def r_delim(s, e)
(a = e%1000) > 0 ? r_delim(s, e/1000) : return; s << a
end
r_delim([], 1234567).join(',')
我會試着在某個時候加的基準。
除了其中一個答案以外,其餘都使用n.to_s
。 @ MrMorphe's沒有,但是他創建了一個數組來編輯join
。這是既不使用Fixnum#to_s也不使用Array#join的方式。
def separate(n,c=' ')
m = n
str = ''
loop do
m,r = m.divmod(1000)
return str.insert(0,"#{r}") if m.zero?
str.insert(0,"#{c}#{"%03d" % r}")
end
end
separate(1) #=> "1"
separate(12) #=> "12"
separate(123) #=> "123"
separate(1234) #=> "1 234"
separate(12045) #=> "12 045"
separate(123456) #=> "123 456"
separate(1234000) #=> "1 234 000"
嗯。這個專欄在右邊小費嗎?
使用to_s
另一種方式,但不是join
:
def separate(n, c=' ')
str = n.to_s
sz = str.size
(3...sz).step(3) { |i| str.insert(sz-i, c) }
str
end
另一種方式: 這裏的 「分隔符是' '
(空間),你可以用錢來換算指定','
。」
number.to_s.reverse.gsub(%r{([0-9]{3}(?=([0-9])))}, "\\1#{delimiter}").reverse
我只是偶然發現了這個線程,同時尋找一種方法來將值格式化爲美元。我參加了一個稍微不同的方法所提出的解決方案,正則表達式:
amt = 1234567890.12
f_amt = format("$%.2f",amt)
i = f_amt.index(".")
while i > 4
f_amt[i-3]=","+f_amt[i-3]
i = f_amt.index(",")
end
f_amt
=> "$1,234,567,890.12"
這可以參數化格式化其他貨幣。
很簡單:
number_with_delimiter(12500, delimiter: " ")
見:http://apidock.com/rails/ActionView/Helpers/NumberHelper/number_with_delimiter
這不是紅寶石,這是唯一的rails方法 –
- 1. 如何將1000 000顯示爲1Million
- 2. 1 000 000 000 000 000 000個Fibonacci數
- 3. 訪問超過1 000 000個數字的最佳方式C#
- 4. 如何在PHP中將數字從0到000格式化?
- 5. 如何將數字格式設置爲只有兩位小數?
- 6. 如何實現C++手機號碼格式:(000)-000-000?
- 7. 如何將數字格式設置爲貨幣?
- 8. 如何將1 - 1000轉換爲單詞?
- 9. 如何設置EditText的數字格式
- 10. 如何將數字格式設置爲具有相同的數字位數?
- 11. 如何將數字格式化爲reportviewer?
- 12. 如何將格式設置爲JFormattedTextField
- 13. 如何將CSV格式設置爲JSON?
- 14. 如何將文本格式設置爲######。##
- 15. 如何在Excel工作表中將列格式設置爲數字格式?
- 16. 如何將Google Charts中座標軸上的格式設置爲特定格式?
- 17. 如何繪製時間爲hh:mm:ss.000格式的數據範圍?
- 18. 如何在輸入時在文本框C#中格式化1 000 000或25 000?
- 19. 無法將我的數字格式化爲小數點後三位(.000)
- 20. 如何將數字格式設置爲使用jexcel api的單元格
- 21. 如何將格式設置爲字符串中的文本
- 22. 如何將輸入的分/秒格式設置爲datetime.now()格式?
- 23. 將數字格式化爲每1000個因子有逗號
- 24. 將單元格格式設置爲數字類型「百分比」
- 25. 如何將數字格式設置爲數組PHP中的貨幣?
- 26. 如何將C++數字格式轉換爲C#數字格式?
- 27. 如何將浮點數格式設置爲整數?
- 28. 將元組的格式列表設置爲1位十進制
- 29. 如何將線寬設置爲-1?
- 30. 如何將貨幣格式的字符串設置爲正常的數字格式?
number_with_delimiter(12500,分隔符:「「) – nilid