Unity中float.TryParse在iPhone端解析失败,编辑器正常求助
问题背景
有一个经Substring处理后的字符串变量_rawJson,内容为:
0.561
使用以下C#代码进行float类型解析:
float moonIllumination = -1; bool success = float.TryParse(_rawJson.Substring(1, 5), out moonIllumination); if (success) { Debug.LogWarning($"Converted '{_rawJson.Substring(1, 5)}' to {moonIllumination}."); } else { Debug.LogWarning($"Attempted conversion of '{_rawJson.Substring(1, 5) ?? \"<null>\"}' failed."); }
在Unity编辑器中运行时输出正常:
Converted '0.561' to 0.561.
但部署到iPhone后解析失败,输出:
Attempted conversion of '0.561' failed.
排查思路与原因提示
区域文化差异是最常见原因
iOS设备的系统区域设置可能用逗号(,)作为小数点分隔符,而非点(.)。float.TryParse默认使用当前线程的文化信息,编辑器通常采用点分隔的文化(如en-US),但iPhone如果是欧洲等区域,会将0.561判定为无效格式。解决时直接指定不变文化解析:using System.Globalization; // ... bool success = float.TryParse( _rawJson.Substring(1, 5), NumberStyles.Float, CultureInfo.InvariantCulture, out moonIllumination );检查字符串是否含隐藏字符
日志显示的0.561可能包含不可见控制字符(如换行、空格、零宽字符),编辑器和iOS的字符串渲染/处理逻辑有差异,导致iOS下解析带隐藏字符的字符串失败。可以先清理字符串再解析:string targetStr = _rawJson.Substring(1, 5).Trim(); bool success = float.TryParse(targetStr, out moonIllumination);或者输出字符串的字节码确认是否有异常字符:
string targetStr = _rawJson.Substring(1, 5); Debug.LogWarning($"String bytes: {BitConverter.ToString(Encoding.UTF8.GetBytes(targetStr))}");验证Substring截取的准确性
原字符串末尾有空格,Substring(1,5)的截取范围可能在iOS下得到意外结果。不同平台对字符串编码的处理可能存在差异,导致截取的内容和编辑器不一致。建议先输出截取后字符串的长度和具体内容:string targetStr = _rawJson.Substring(1, 5); Debug.LogWarning($"Target string: '{targetStr}', length: {targetStr.Length}");如果截取的内容包含空格或其他多余字符,调整Substring的参数或先做Trim处理。
尝试替换解析方式
极少数情况下,Unity iOS平台对float.TryParse的底层实现有差异,可以尝试用double.TryParse转float,或者手动拆分字符串计算:// 手动解析示例 string targetStr = _rawJson.Substring(1, 5).Trim(); if (double.TryParse(targetStr, out double temp)) { moonIllumination = (float)temp; success = true; }
内容的提问来源于stack exchange,提问作者PeterK
相关产品推荐
相关产品推荐

