格式化数字时,我想在每三个字符处放一个空格.根据这个规范:
it "should format an amount" do
spaces_on( 1202003 ).should == "1 202 003"
end
Run Code Online (Sandbox Code Playgroud)
我想出了这段代码来完成这项工作
def spaces_on amount
thousands = amount / 1000
remainder = amount % 1000
if thousands == 0
"#{remainder}"
else
zero_padded_remainder = '%03.f' % remainder
"#{spaces_on thousands} #{zero_padded_remainder}"
end
end
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这是否是最好的方法.我怀疑它可能有一个正则表达式,但我不确定我是否会喜欢它的可读性.(另一方面 - %03.f魔法也不是很易读......)
>> def spaces_on number
>> number.to_s.gsub(/\D/, '').reverse.gsub(/.{3}/, '\0 ').reverse
>> end
=> nil
>> spaces_on 12345678
=> "12 345 678"
Run Code Online (Sandbox Code Playgroud)
也许有一个论点,正则表达式的可读性并不令人惊讶,但我个人认为它们比在递归中思考更容易理解.
对Gareth解决方案的一个小修改(更复杂的正则表达式,但没有字符串反转):
def spaces_on number
number.to_s.gsub(/\d(?=(...)+$)/, '\0 ')
end
Run Code Online (Sandbox Code Playgroud)
它也适用于负数(但不适用于浮点数).
def spaces_on(number,sep=" ")
number.to_s.tap do |s|
:go while s.gsub!(/^([^.]*)(\d)(?=(\d{3})+)/, "\\1\\2#{sep}")
end
end
NUMBERS = [ 1, 12, 123, 1234, 12345, 123456, 1234567,
1.0, 1.2, 1.23, 1.234, 1.2345, 1.23456, 1.234567,
12.3, 12.34, 12.345, 12.3456,
123.4, 123.45, 123.456, 123.4567,
1234.5, 1234.5, 1234.56, 1234.567, 1234.5678 ]
NUMBERS.each do |n|
puts "%10s: %s" % [ n, spaces_on(n).inspect ]
puts "%10s: %s" % [ -n, spaces_on(-n).inspect ]
end
Run Code Online (Sandbox Code Playgroud)
生产:
1: "1"
-1: "-1"
12: "12"
-12: "-12"
123: "123"
-123: "-123"
1234: "1 234"
-1234: "-1 234"
12345: "12 345"
-12345: "-12 345"
123456: "123 456"
-123456: "-123 456"
1234567: "1 234 567"
-1234567: "-1 234 567"
1.0: "1.0"
-1.0: "-1.0"
1.2: "1.2"
-1.2: "-1.2"
1.23: "1.23"
-1.23: "-1.23"
1.234: "1.234"
-1.234: "-1.234"
1.2345: "1.2345"
-1.2345: "-1.2345"
1.23456: "1.23456"
-1.23456: "-1.23456"
1.234567: "1.234567"
-1.234567: "-1.234567"
12.3: "12.3"
-12.3: "-12.3"
12.34: "12.34"
-12.34: "-12.34"
12.345: "12.345"
-12.345: "-12.345"
12.3456: "12.3456"
-12.3456: "-12.3456"
123.4: "123.4"
-123.4: "-123.4"
123.45: "123.45"
-123.45: "-123.45"
123.456: "123.456"
-123.456: "-123.456"
123.4567: "123.4567"
-123.4567: "-123.4567"
1234.5: "1 234.5"
-1234.5: "-1 234.5"
1234.5: "1 234.5"
-1234.5: "-1 234.5"
1234.56: "1 234.56"
-1234.56: "-1 234.56"
1234.567: "1 234.567"
-1234.567: "-1 234.567"
1234.5678: "1 234.5678"
-1234.5678: "-1 234.5678"
Run Code Online (Sandbox Code Playgroud)