用 Ruby 移动十进制固定数量的空格

Move decimal fixed number of spaces with Ruby

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

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

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

在 Ruby 中我该怎么做?

鉴于:

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

您可以使用:

my_number = my_map["base_price"].to_i / (10**my_map["decimals"]).to_f
puts(my_number)
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 }

他们也不考虑四舍五入的问题。

正则表达式和插值?

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

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

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

制作中:

=> "5.000000000000000000"