如何在PHP中将years.months格式字符串转换为总月数?
问题描述
客户提供的非标准格式数据,原本预期年、月分为两列,实际却是以点分隔的字符串格式:[years].[months]。该数据已导入MySQL数据库,需在PHP中将years.months格式转换为总月数,测试用例:
1.2(1年2个月)转换为141.0(1年0个月)转换为12
原代码存在问题,需要修正:
$yearwithdecimal = "1.2"; $yearwithdecimal = (float)$yearwithdecimal; if (is_float($yearwithdecimal)) { $yearsArray = explode(".",$yearwithdecimal); $year_months = $yearsArray[0]*12; $more_months = $yearsArray[1]; $total_months = $year_months + $more_months; }else{ $total_months = $yearwithdecimal*12; } echo $total_months; die; // Output is 14
原代码的问题
- 浮点转换丢失格式/精度:比如输入
"1.0"转成float后变为1,explode拆分仅得到["1"],访问$yearsArray[1]会触发未定义索引错误;输入"2.10"转成float后会变成2.1,拆分后得到["2", "1"],实际应加10个月,结果错误。 - 类型判断逻辑无效:整数形式的字符串(如
"3")转成float后会变成3.0,进入if分支,但拆分同样会出现索引缺失问题。
修正后的代码
直接对原始字符串处理,规避类型转换带来的问题:
$yearWithDecimal = "1.0"; // 可替换为任意目标字符串 // 按点分割原始字符串 $parts = explode(".", $yearWithDecimal); // 提取年份:取第一个元素转整数,空输入默认0 $years = isset($parts[0]) ? (int)$parts[0] : 0; // 提取月份:有第二个元素则转整数,无则默认0 $months = isset($parts[1]) ? (int)$parts[1] : 0; $totalMonths = $years * 12 + $months; echo $totalMonths; // 输出12
测试验证
- 输入
"1.2"→ 输出14 - 输入
"1.0"→ 输出12 - 输入
"2.10"→ 输出34(2*12+10=34) - 输入
"5"→ 输出60(5*12+0=60) - 输入
"0.7"→ 输出7
内容的提问来源于stack exchange,提问作者Amit Gupta
相关产品推荐
相关产品推荐

