在数值中插入逗号(INR值)-Perl

在数值中插入逗号(INR值)-Perl,perl,Perl,我正在尝试编写一个脚本,将整数转换为逗号分隔的值: 例如输入:23454546.3435353测试1234546789.3435353#“n”个值将出现 我正在接收输出:234,54546.34,35353测试1234546789.34,35353 我的查询是,在十进制值之后不要插入, 所需输出:2,34,546.*3435353**test1,23,45,45,46789.*3435353** 我的代码: my $strg = "23454546.3435353 test 12345

我正在尝试编写一个脚本,将整数转换为逗号分隔的值:

例如输入:
23454546.3435353测试1234546789.3435353
#“n”个值将出现

我正在接收输出:
234,54546.34,35353测试1234546789.34,35353

我的查询是,在十进制值之后不要插入

所需输出:
2,34,546.*3435353**
test
1,23,45,45,46789.*3435353**

我的代码:

my $strg = "23454546.3435353 test 123454546789.3435353"

$strg=~s#([^\.])(\d{4,})#  my $no_dot=$1; my $nums = $2; my $cnt = $nums=~s/\d/$&/g; 
if($cnt eq 8) {  $nums=~s/^(\d{1})(\d{2})(\d{2})(\d{3})$/$1\, $2\, $3\, $4/g;  }
if($cnt eq 7) {  $nums=~s/^(\d{2})(\d{2})(\d{3})$/$1\, $2\, $3/g;  }
if($cnt eq 6) {  $nums=~s/^(\d{1})(\d{2})(\d{3})$/$1\, $2\, $3/g;  }
if($cnt eq 5) {  $nums=~s/^(\d{2})(\d{3})$/$1\, $2/g;  }
if($cnt eq 4) {  $nums=~s/^(\d{1})(\d{3})$/$1\, $2/g;  }
($no_dot.$nums);
#ge;
请告诉我哪里做错了。

也许更容易使用

输出

23,454,546.34 INR
2,34,54,546.3435353 test 1,23,45,45,46,789.3435353
编辑

23,454,546.34 INR
2,34,54,546.3435353 test 1,23,45,45,46,789.3435353
似乎模块无法修改精度。如果希望精度不是2,可以尝试使用蛮力方法。例如:

my $strg = "23454546.3435353 test 123454546789.3435353";
$strg =~ s/(\d+)\.(\d+)/do_subst($1,$2)/ge;
sub do_subst {
    my ($p1, $p2) = @_;
    my $temp = reverse $p1;
    my @parts;
    push @parts, $1 if $temp =~ s/^(\d{1,3})//;
    while (length $temp) {
        push @parts, $1, if $temp =~ s/^(\d{1,2})//;
    }
    return (join ',', map {my $p = reverse $_; $p} reverse @parts) . '.' . $p2;
}
say $strg;
输出

23,454,546.34 INR
2,34,54,546.3435353 test 1,23,45,45,46,789.3435353

您对相关字符串的检测存在缺陷。你有:

([^\.])(\d{4,})
但这意味着第一个字符可以是数字。 这就解释了为什么输出中会出现
234,
。 它还将匹配超过一个句点的数字(因此在
.3435353
中,您将匹配
3435353
)。请注意,
\
是不需要的(
在方括号内不是特别的)

试试这个:

$strg=~s{
(                # $1:
(^ |\s)#分隔符(空格或行首)
\d{4,}#需要逗号的数字
)
(?=#前瞻:
(\.\d+)\可选小数部分
(\s |$)#分隔符(空格或行尾)
)
}{
本地美元=1美元;
s/(\d)(?=(\d{2})*\d{3}$)/$1,/g;
$_;
}xeg;
外部正则表达式匹配由4个或更多数字组成的运行(可选后跟小数部分),以空格或字符串的开头/结尾分隔


内部正则表达式还利用前向查找需要逗号的数字(即从右边开始的2n+4)。由于前瞻的贪婪匹配,从左侧开始进行替换。

“所需输出:2,34,546.**3435353*”:为什么不从23,45,45,46.34353开始?请解释用于插入commasIts INR-印度货币值的算法。请修改代码,使其运行并产生一些输出。第一行缺少分号。修复生成不输出任何内容的脚本。我假设结果是$strg?@ssr1012“Its INR”ok.的内容。。那么像decribed?也就是说:“.印度编号系统将最右边的三位数字组合在一起(直到百位),然后再按两位数字的集合进行分组…”另请参见Fine。但是我需要十进制
.3435353
后的实际值,而不是
.34
此外,您可以使用前缀调用format:
s/(\d+\.\d{1,2})(\d*)/currency\u format('INR',$1)。$2/ge
@jhnc是的,我考虑过,但是
currency\u format()。它给出了
23454546
当预期值为
2时,34,546
没有发现。似乎是一个相当大的错误!很好的解释。