using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Runtime.CompilerServices; using UnityEngine; namespace XericLibrary.Runtime.MacroLibrary { public static partial class MacroMath { #region 名称文本 /// /// 获取此处的物体名称,如果带有(clone)后缀,则省略这个后缀 /// [MethodImpl(MethodImplOptions.NoInlining)] public static string GetGameObjectNameWithoutClone(GameObject gameObject) { return GetGameObjectNameWithoutClone(gameObject.name); } /// /// 获取此处的物体名称,如果带有(clone)后缀,则省略这个后缀 /// [MethodImpl(MethodImplOptions.NoInlining)] public static string GetGameObjectNameWithoutClone(string gameObjectName) { const string cloneSuffix = "(Clone)"; if(gameObjectName.EndsWith(cloneSuffix)) { int suffixIndex = gameObjectName.LastIndexOf(cloneSuffix); string nameWithoutClone = gameObjectName.Substring(0, suffixIndex); return nameWithoutClone; } return gameObjectName; } #endregion #region 转文本 /// /// 将一个数值四舍五入后转为一个文本,并保留特定的小数点位,如果这个小数位为0则省略不写 /// /// /// 目标小数位 /// public static string RoundToString(this double value, int decimals) { if(value == 0) return "0"; return Math.Round(value, decimals).ToString(); } public static string RoundToString(this float value, int decimals) { return ((double)value).RoundToString(decimals); } #endregion #region 区域与语言 #if false /// /// 将一个数值转为中文小写格式 /// /// /// public static string NumberToChinese_Format(int number) { CultureInfo cultureInfo = new CultureInfo("zh-CN"); // 使用文化信息中的数字格式来将数字转换为中文 return string.Format(cultureInfo, "{0:R}", number); // 遗憾的是会报R无效 } #endif private static readonly string[] chineseNumber = new string[] {"零","一","二","三","四","五","六","七","八","九"}; private static readonly string[] chineseDigit = new string[] { "","十","百","千","万","十","百","千","亿","十","百","千","亿"}; private static readonly string[] chineseNumber_ComplexFont = new string[] {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; private static readonly string[] chineseDigit_ComplexFont = new string[] { "","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","亿"}; /// /// 将一个数值转为中文小写格式; /// /// /// private static string NumberToChinese(int number, out bool needFillZero, int digit = 0) { needFillZero = false; // 取消输出最高位的零 if(number == 0) return ""; // 高位拼接一个当前位 if(number > 0) { int digitNumber = number % 10; var result = NumberToChinese(number / 10, out var fillZero, digit + 1); // 此处为零,后续可能需要填充一个零 needFillZero = digitNumber == 0; // 如果此处为零,则等待低位处理填充 var proclitic = needFillZero ? "" : (fillZero ? chineseNumber[0] : "") + chineseNumber[digitNumber] + chineseDigit[digit] ; return result + proclitic; } // 输出最高位 return chineseNumber[number] + chineseDigit[digit]; } /// /// 将一个数值转为中文小写格式,并确保读写格式满足日常使用; /// 比如 510会读成五百一十,9009会读成九千零九, /// 最大支持到九千亿,理论上并不是它的极限,只要继续套格式即可。 /// /// /// public static string NumberToChinese(int number) { string guide = ""; // 如果为零直接输出,因为单个0没法读 if(number == 0) return chineseNumber[0]; // 如果为负就在前面加上负 if(number < 0) guide = "负"; string result; // 特殊处理 switch(number) { case 10: result = "十"; break; case 11: result = "十一"; break; case 12: result = "十二"; break; case 13: result = "十三"; break; case 14: result = "十四"; break; case 15: result = "十五"; break; case 16: result = "十六"; break; case 17: result = "十七"; break; case 18: result = "十八"; break; case 19: result = "十九"; break; default: result = NumberToChinese(Mathf.Abs(number), out var zero); break; } // 合并格式化 return guide + result; } #endregion } }