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
}
}