我想这会很容易,但我在任何地方都找不到任何关于它的信息。假设用户输入123456。我想用科学的符号来显示这个。因此,这将是1.23456 * 10^5。我估计红宝石或rails会有一个助手方法,比如scientific_notation(123456),但是我什么也找不到。这个是可能的吗?
更进一步的是,如果用户输入科学符号,那么处理这个数字又如何呢?例如,他们输入1.23456x10^6 - rails解析这个,并将123456存储在数据库中。
我意识到第二部分的可能性很大。
发布于 2015-07-08 19:59:07
要将一个数字转换为e
的幂,我们可以使用%
运算符。
那么说x = 123456
吧
"%e" %x
=> 1.234560e+05
发布于 2016-01-22 05:09:15
要将整数、Bignum或BigDecimal转换为科学数字表示法,可以使用.to_f方法。
这里有几个例子:
# Generate a long number
num = BigDecimal.new('123e+100')
#=> #<BigDecimal:1bca380,'0.123E1003',9(18)>
num.to_s
#=> "123000000000000....
num.to_f
#=> 1.23e+102
# Convert BigDecimal to integer
int = num.to_i
#=> 123000000000000....
int.class
#=> Bignum
int.to_f
#=> 1.23e+102
通常使用整数上的.to_f,如果数字很长(长度> 15),Bignum和BigDecimal会用科学符号来转换这个数字。
发布于 2022-11-04 04:22:35
因为我认为这个问题没有得到完全的回答(长分数部分的数字的符号和可能的截断),而且我需要一些接近原始问题的东西,这是我的解决方案。
我正在使用BigDecimal并扩展类来实现我的助手(如果您希望将其提取到自己的模块或类中,则只需要更改方法签名和主体的第一行)。
class BigDecimal
def to_sci(power_format='*10^%i')
match_result = to_s.match(/0\.([0-9])([0-9]*)e([+-]?[0-9]*)/)
int_part = match_result[1]
float_part = match_result[2]
exponent = match_result[3].to_i - 1
significand = if float_part.empty?
int_part
else
"#{int_part}.#{float_part}"
end
formatter = if negative?
"-%s#{power_format}"
else
"%s#{power_format}"
end
formatter % [significand, exponent]
end
end
代码的一个可能的改进是添加一个精确的参数。我从来不需要它,因此没有实现它。
还可以将方法添加到Integer和Float,作为快捷方式:
require 'bigdecimal/util'
class Integer
def to_sci(power_format='*10^%i')
to_d.to_sci(power_notation)
end
end
class Float
def to_sci(power_format='*10^%i')
to_d.to_sci(power_format)
end
end
示例用法:
120.to_sci # Output: '1.2*10^2'
120.to_sci('\cdot 10^{%i}') # Output: '1.2\cdot 10^{2}'
0.05.to_sci('x10^%i') # Output: '5x10^-2'
来自用户输入的号码
至于从用户获取数字的第二个问题(如'1.3x10^3‘或'1.3*10^3'),一个选项可能如下所示。请注意,这是未经测试的,可能会破坏一些边缘的情况。我假设我们有很好的用户,它们只输入有效的输入,如"2.3x10^3"
、"2.3X10^3"
、"2.3*10^3"
或类似的。
def from_sci(str)
BigDecimal(str.gsub(/[*xX]10\^/, 'e'))
end
https://stackoverflow.com/questions/31307780
复制相似问题