Tim*_*van 9 currency ruby-on-rails internationalization
我有一个处理货币输入的应用程序.但是,如果您在美国,则可以输入一个数字12,345.67; 在法国,它可能是12.345,67.
在Rails中,有一种简单的方法可以使货币条目适应区域设置吗?
请注意,我不是在寻找货币的显示(ala number_to_currency),我正在寻找与某人输入货币字符串并将其转换为小数的人.
小智 11
你可以试一试:
def string_to_float(string)
string.gsub!(/[^\d.,]/,'') # Replace all Currency Symbols, Letters and -- from the string
if string =~ /^.*[\.,]\d{1}$/ # If string ends in a single digit (e.g. ,2)
string = string + "0" # make it ,20 in order for the result to be in "cents"
end
unless string =~ /^.*[\.,]\d{2}$/ # If does not end in ,00 / .00 then
string = string + "00" # add trailing 00 to turn it into cents
end
string.gsub!(/[\.,]/,'') # Replace all (.) and (,) so the string result becomes in "cents"
string.to_f / 100 # Let to_float do the rest
end
Run Code Online (Sandbox Code Playgroud)
和测试案例:
describe Currency do
it "should mix and match" do
Currency.string_to_float("$ 1,000.50").should eql(1000.50)
Currency.string_to_float("€ 1.000,50").should eql(1000.50)
Currency.string_to_float("€ 1.000,--").should eql(1000.to_f)
Currency.string_to_float("$ 1,000.--").should eql(1000.to_f)
end
it "should strip the € sign" do
Currency.string_to_float("€1").should eql(1.to_f)
end
it "should strip the $ sign" do
Currency.string_to_float("$1").should eql(1.to_f)
end
it "should strip letter characters" do
Currency.string_to_float("a123bc2").should eql(1232.to_f)
end
it "should strip - and --" do
Currency.string_to_float("100,-").should eql(100.to_f)
Currency.string_to_float("100,--").should eql(100.to_f)
end
it "should convert the , as delimitor to a ." do
Currency.string_to_float("100,10").should eql(100.10)
end
it "should convert ignore , and . as separators" do
Currency.string_to_float("1.000,10").should eql(1000.10)
Currency.string_to_float("1,000.10").should eql(1000.10)
end
it "should be generous if you make a type in the last '0' digit" do
Currency.string_to_float("123,2").should eql(123.2)
end
Run Code Online (Sandbox Code Playgroud)
小智 5
我们写了这个:
class String
def safe_parse
self.gsub(I18n.t("number.currency.format.unit"), '').gsub(I18n.t("number.currency.format.delimiter"), '').gsub(I18n.t("number.currency.format.separator"), '.').to_f
end
end
Run Code Online (Sandbox Code Playgroud)
当然,在使用它之前,您必须设置I18n.locale.它目前只将字符串转换为已设置的语言环境的浮点数.(在我们的例子中,如果用户在法国网站上,我们希望货币金额文本只包含与法国语言环境相关的符号和格式).
| 归档时间: |
|
| 查看次数: |
5219 次 |
| 最近记录: |