如何在数字的最后三位数之前插入小数点?

ale*_*ood 11 perl

我有一个数字,需要添加一个小数来格式化.

这个数字保证在1000到999999之间(我已经用其他方式涵盖了其他可能性,这是我无法理解的).我需要在最后3位数之前加一个小数,例如:

1000   -> 1.000
23513  -> 23.513
999999 -> 999.999
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

dra*_*tun 44

而另一种有趣的方式;-)

my $num_3dec = sprintf '%.3f', $num / 1000;
Run Code Online (Sandbox Code Playgroud)

  • +1这是问题的正确答案.OP错误地认为需要正则表达式替换的事实并没有改变这一点. (11认同)
  • 我认为这太清楚地表达了输入数据的含义,应该避免使用更神秘的东西:-) (9认同)
  • 不,这不一定是问题的正确答案.如果您有64位perl和> 15位数字,这可能是错误的答案,而substr或s ///将始终有效. (4认同)

Pat*_*Pat 14

这是另一种解决方案,只是为了它的乐趣:

在Perl中,substr()可以是一个左值,它可以帮助你的情况.

substr ($num , -3 , 0) = '.';
Run Code Online (Sandbox Code Playgroud)

将在最后三位数之前添加一个点.

您还可以使用substr的四个参数版本(在注释中指出)来获得相同的效果:

substr( $num, -3, 0, '.' );
Run Code Online (Sandbox Code Playgroud)

我希望它比正则表达式解决方案更优雅/可读,但我相信它会抛弃任何不习惯将substr()用作左值的人.

  • 最好写成"`substr($ num,-3,0,'.');`" (2认同)

Ada*_*kin 10

$num =~ s/(\d{3})$/.$1/
Run Code Online (Sandbox Code Playgroud)

这就是说:取一个3位数的块(必须锚定在字符串的END处)并用" ." 替换它们,然后用匹配的任何东西替换它们.

  • 这不是最好的答案; 请参阅下面的draegtun的回应,这是更可取的. (4认同)
  • 实际上它*是*问题的最佳答案,尽管可能不是完成手头任务的最佳方式.这个问题特别要求正则表达式. (2认同)