【问题标题】:Move decimal fixed number of spaces with Ruby使用 Ruby 移动十进制固定数量的空格
【发布时间】:2021-10-25 19:06:42
【问题描述】:

我将大整数(通常为 15-30 位)存储为字符串,表示一定数量的给定 currenty(例如 ETH)。还存储了移动小数的位数。

{
    "base_price"=>"5000000000000000000",
    "decimals"=>18
}

我最终要查找的输出是 5.00(如果从 5000000000000000000 中取出小数点并将其移动到左侧 18 位,您会得到)。

我将如何在 Ruby 中做到这一点?

【问题讨论】:

  • 是否要对字符串执行操作?或者您是否希望从运算中得到一个数值(如浮点值)?
  • val = h['base_price'].to_i / 10.0 ** h['decimals'] #=> 5.0 或者您可以使用 val = h['base_price'].dup.insert(h['base_price'].length - h["decimals"],'.') #=> "5.000000000000000000" 使用您最喜欢的转换方式转换为数字,例如val.to_fBigDecimal(val)Float(val)
  • @ScottThompson 最终格式几乎无关紧要。这是对最终用户的展示。只想在输出中将5000000000000000000 表示为5.00
  • 如果整数是5006"decimals"等于3怎么办?

标签: ruby numbers


【解决方案1】:

给定:

my_map = {
    "base_price"=>"5000000000000000000",
    "decimals"=>18
}

你可以使用:

my_number = my_map["base_price"].to_i / (10**my_map["decimals"]).to_f
puts(my_number)

【讨论】:

  • Shpigford,这会产生浮点数5.0,而您说想要的结果是5.00,大概是一个字符串。
【解决方案2】:
h = { "base_price"=>"5000000000000000000", "decimals"=>18 }
​​​
bef, aft = h["base_price"].split(/(?=\d{#{h["decimals"]}}\z)/)
  #=> ["5", "000000000000000000"]

bef + '.' + aft[0,2]
  #=> "5.00"

正则表达式使用正向前瞻(?=\d{18}\z) 在数字之间的(“零宽度”)位置拆分字符串,以便18 数字跟在字符串的末尾。

或者,可以这样写:

str = h["base_price"][0, h["base_price"].size-h["decimals"]+2]
  #=> h["base_price"][0, 3]
  #=> "500"
str.insert(str.size-2, '.')
  #=> "5.00"

这些都没有解决潜在的边界情况,例如

{ "base_price"=>"500", "decimals"=>1 }

{ "base_price"=>"500", "decimals"=>4 }

他们也不考虑舍入问题。

【讨论】:

    【解决方案3】:

    正则表达式和插值?

    my_map = {
        "base_price"=>"5000000000000000000",
        "decimals"=>18
    }
    
    my_map["base_price"].sub(
        /(0{#{my_map["decimals"]}})\s*$/, 
        ".#{$1}"
    )
    

    小数位数被插入到正则表达式中,作为要从字符串末尾查找的零的计数(加上零个或多个空白字符)。这是匹配的,并且匹配被替换为 . 在它前面。

    制作:

    => "5.000000000000000000"
    

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 2012-03-04
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多