PHP如何提取并格式化字符串中的指定数字并放回原位置?
解决固定模式字符串的数字格式化问题
我来帮你搞定这个字符串格式化需求!因为你的字符串模式是固定的,咱们可以用正则表达式提取关键部分 + number_format()格式化数字的组合方式来实现,具体步骤如下:
1. 先明确各部分的格式转换规则
先拆解输入和输出的对应关系,搞清楚每个数字要怎么转:
- 数量:
5.400PCE→5,40PCE:把原数字(点作小数分隔)转成保留两位小数、逗号作小数分隔的格式 - 重量:
2,340Kg→2.340,00Kg:把原数字(逗号作千分位)转成千分位用点、小数位保留两位且用逗号分隔的格式 - 体积:
6.000M3→6M3:直接去掉小数部分,保留整数
2. 用正则提取所有关键组件
因为字符串结构固定,我们可以写一个精准的正则表达式,把商品名称、数量数字、单位、重量数字、体积数字、类型这些部分都提取出来。
PHP代码示例:
$input = 'HAMMER FORGED (5.400PCE-2,340Kg-6.000M3-DANGER TYPE 2)'; // 正则匹配固定结构的字符串 $pattern = '/^([A-Z\s]+)\s\(([\d.,]+)(PCE)-([\d.,]+)(Kg)-([\d.,]+)(M3)-([A-Z\s\d]+)\)$/'; preg_match($pattern, $input, $matches); // 提取后的各部分: // $matches[1] = "HAMMER FORGED"(商品名称) // $matches[2] = "5.400"(数量数字) // $matches[3] = "PCE"(数量单位) // $matches[4] = "2,340"(重量数字) // $matches[5] = "Kg"(重量单位) // $matches[6] = "6.000"(体积数字) // $matches[7] = "M3"(体积单位) // $matches[8] = "DANGER TYPE 2"(类型)
3. 用number_format()分别格式化数字
针对每个数字的转换规则,用number_format()处理,注意要先把原数字的分隔符统一成PHP能识别的格式(点作小数分隔):
// 格式化数量:保留两位小数,逗号作小数分隔 $quantity = number_format((float)$matches[2], 2, ',', ''); // 格式化重量:先把逗号替换成点转成数字,再设置千分位用点、小数用逗号,保留两位小数 $weight = number_format((float)str_replace(',', '.', $matches[4]), 2, ',', '.'); // 格式化体积:直接转成整数去掉小数部分 $volume = (int)(float)$matches[6];
4. 拼接成目标字符串
最后把所有处理好的部分拼接起来就得到想要的格式了:
$output = sprintf("%s (%s%s-%s%s-%s%s-%s)", $matches[1], $quantity, $matches[3], $weight, $matches[5], $volume, $matches[7], $matches[8] ); // 输出结果:HAMMER FORGED (5,40PCE-2.340,00Kg-6M3-DANGER TYPE 2) echo $output;
这样不管字符串长度怎么动态变化,只要结构符合你说的固定模式,这个方法都能完美适配哦!
内容的提问来源于stack exchange,提问作者Angga Ari Wijaya
相关产品推荐
相关产品推荐

