当前位置: 首页 > 知识库问答 >
问题:

如何在前9位和后2位之间添加小数点?

鱼安然
2023-03-14

我如何添加一个小数点之间的前9位数字和最后2位的值,是拉在行:$matchesLine[$key]=substr($line,166,11);?作为,读取的值不包含小数点。

样本数据

输入:00023659819

所需输出:##

@Shlomtzion提供的脚本

<?php


$text = "I0023540987805R01  ABC                         GHI                       OLirrt                 000000000000000100EA 0812160070451700   1098833   1990041300000001086000000000108600000000000996000000000032100000000000000000000000000000000000000000000000000000000000000000000006589000000000000000                                     P0012B    
0000002032902R01  DEF                         JKL                       KLijuI                 000000000000000100EA 0812160070451700   1029132   1997010800000002396000000000239600000120002326000000000000000000000000000000000000000000000000000000000000004560000000000000000000000000987600000000                                     A203SD   ";

echo '<pre>';
$txt = explode("\n",$text);

echo '<pre>';
print_r($txt);

foreach($txt as $key => $line){
    $subbedString = substr($line,2,11);

    $searchfor = '02354098780';
    //echo strpos($subbedString,$searchfor); 
    if(strpos($subbedString,$searchfor) === 0){
        $matches[$key] = $searchfor;
        $matchesLine[$key] = substr($line,166,11);
        echo "Found in line : $key";
    }

    
}

echo '<pre>';
print_r($matches);

echo '<pre>';
print_r($matchesLine);

共有2个答案

武功
2023-03-14

您可以匹配166个字符,然后使用2个捕获组捕获9位和2位数字。

更换时,使用两组,中间添加一个点。

^.{166}\K(\d{9})(\d{2})
  • ^字符串的开始
  • .{166}匹配166个字符
  • \K忘记匹配到现在的东西
  • (\d{9})(\d{2})在组1中捕获9位,在组2中捕获2位

正则表达式演示

替换为$1.$2

$text = "I0023540987805R01  ABC                         GHI                       OLirrt                 000000000000000100EA 0812160070451700   1098833   1990041300000001086000000000108600000000000996000000000032100000000000000000000000000000000000000000000000000000000000000000000006589000000000000000                                     P0012B    
0000002032902R01  DEF                         JKL                       KLijuI                 000000000000000100EA 0812160070451700   1029132   1997010800000002396000000000239600000120002326000000000000000000000000000000000000000000000000000000000000004560000000000000000000000000987600000000                                     A203SD   ";

echo '<pre>';
$txt = explode("\n",$text);

$pattern = "/^.{166}\K(\d{9})(\d{2})/";
foreach($txt as $key => $line){
    echo preg_replace($pattern, "$1.$2", $line) . PHP_EOL;
}

输出

<pre>I0023540987805R01  ABC                         GHI                       OLirrt                 000000000000000100EA 0812160070451700   1098833   19900413000000010860000000001.08600000000000996000000000032100000000000000000000000000000000000000000000000000000000000000000000006589000000000000000                                     P0012B    
0000002032902R01  DEF                         JKL                       KLijuI                 000000000000000100EA 0812160070451700   1029132   199701080000000239600000000023.9600000120002326000000000000000000000000000000000000000000000000000000000000004560000000000000000000000000987600000000 

                                A203SD   
唐阳泽
2023-03-14

这里有一种方法可以通过preg\u replace

$input = "00023659819";
$output = preg_replace("/(?=\d{2}$)/", ".", $input);
echo $output;  // 000236598.19
 类似资料:
  • 我在打印格式上有一个小问题。如果数字不是整数,我想打印小数点后的2位数字(例如55.53467- 我拥有的代码是: 当然,它总是打印两位数。非常感谢

  • 我有一个,我希望将用户的输入限制为纯数字或小数最多2位的数字。 基本上,我要求的是一个价格输入。 我想避免做正则表达式。有办法做到吗?

  • 问题内容: 我已经阅读了很多stackoverflow问题,但似乎没有一个对我有用。我正在四舍五入。这是代码: 我得到的输出是:但我希望它是。我读到添加会有所帮助,但是如你所见,我没有设法使其工作。 输入和输出都必须是双倍是绝对必要的。 如果你更改上面代码的第4行并将其发布,那将是非常有用的帮助。 问题答案: 输出是 或如@Rufein所说 这也会为你做。

  • 问题内容: 每次我想四舍五入到小数点后两位小数时,它都不想四舍五入…我怎么能将它四舍五入到小数点后两位零,那会给我92.00而不是92? 给我 但我想要 我使用了TO_CHAR,它起作用了 谢谢你们! 问题答案: 您可以尝试使用TO_CHAR函数来转换结果 例如 希望能帮助到你

  • 问题内容: 我需要四舍五入,它应该是两位小数。 尝试了以下内容 28.27 但是期望值仅为28.26。 问题答案: 似乎您需要:

  • 如有任何帮助,不胜感激,谢谢。