我正在使用Unity3D和C#制作汽车游戏,我想显示速度,但是我不能删除小数。请帮助。
我已经搜索了一个多小时,但是没有什么能解决我的问题。
var speed = Convert.ToString(GetComponent<Rigidbody>().velocity.magnitude * 3.6);
speed = String.Format("{0:C0}", speed);
Camera.FindObjectOfType<TextMesh>().text = speed;
答案 0 :(得分:3)
您正在将string
传递给
String.Format("{0:C0}", speed);
格式化程序仅适用于数字值(int
,float
,double
,...)不适用于string
的。< / p>
另请参阅有关custom numeric format strings和standard numeric format strings的更多信息,因为"C0"
用于Currency
,可能不是您要查找的内容。您可能评级者想将"N0"
用作Numeric
或仅使用如下所示的自定义字符串。
您并没有真正指定输出的确切外观,以及是否要截断所有小数位或仅截取特定精度的输出。
直接将其传递给
// Also note the f here for a float multiplication!
// |
// v
var speed = (GetComponent<Rigidbody>().velocity.magnitude * 3.6f).ToString("0.00");
或
var speed = (GetComponent<Rigidbody>().velocity.magnitude * 3.6f).ToString("0");
或者,您也可以如注释中所述使用Mathf.RoundToInt
以便首先舍入为int值
var speed = Mathf.RoundToInt(GetComponent<Rigidbody>().velocity.magnitude * 3.6f).ToString();
旁注:
关于效率的最后附注:
似乎您想在例如反复Update
...不要!
在游戏开始时只使用Find
和GetCompnent
一次,以后再使用引用即可:
// if possible even reference this in the Inspector right
// away than you don't need the Awake method at all
[SerializeField] private RigidBody rigidBody;
[SerializeField] private TextMesh textMesh;
privtae void Awake()
{
if(!rigidBody) rigidBody = GetComponent<Rigidbody>();
if(!textMesh) textMesh = Camera.FindObjectOfType<TextMesh>();
}
privtae void Update()
{
var speed = Convert.ToString(rigidBody.velocity.magnitude * 3.6);
speed = String.Format("{0:C0}", speed);
textMesh.text = speed;
}
答案 1 :(得分:0)
C
格式代表“货币”。以下代码使用N
修饰符作为'number':
decimal speed;
speed = 2.4m;
Console.WriteLine(String.Format("{0:N0}", speed));
speed = 2.5m;
Console.WriteLine(String.Format("{0:N0}", speed));
speed = 2.6m;
Console.WriteLine(String.Format("{0:N0}", speed));
产生如下结果:
2
3
3
对于float
和double
类型,其作用相同。
请注意,您的代码speed
是一个字符串,显然,它不能使用数字格式。