3

我有一个NSDecimalNumber来自 StoreKit 的SKProduct课程,我想将其转换为 C# 的decimal类型以最大程度地减少精度损失。有没有一种简单的方法来做这样的事情?

我想我的两个选择是:

  1. 假设我了解每个的二进制实现并进行自己的按位转换,或者
  2. 给我NSDecimalNumber一个字符串,然后decimal解析它。

我认为选项 1 工作量太大,甚至可能很脆弱,所以我倾向于选择选项 2。但这似乎也不是我能做的最好的。(我可以忍受它会有多慢,因为它很少发生。

4

3 回答 3

5

NSDecimalNSDecimalNumber结构表示与 .NET 不同System.Decimal

转换总是可能的,但并不容易。如果性能不是一个大问题,那么最好使用string表示在它们之间进行转换。

于 2012-11-05T21:40:12.453 回答
3

仅仅因为这让我绊倒并花费了我相当长的时间,这里有几个扩展方法,我现在用于在 和 之间进行NSDecimal转换decimal。这非常令人沮丧,我很惊讶没有更好的内置方法。

public static class NumberHelper
{
    public static decimal ToDecimal(this NSDecimal number)
    {
        var stringRepresentation = new NSDecimalNumber (number).ToString ();
        return decimal.Parse(stringRepresentation, CultureInfo.InvariantCulture);
    }

    public static NSDecimal ToNSDecimal(this decimal number)
    {
        return new NSDecimalNumber(number.ToString(CultureInfo.InvariantCulture)).NSDecimalValue;
    }
}
于 2014-07-24T02:46:53.497 回答
1

自 Xamarin iOS SDK 12 起,运算符可用于将 NSDecimal 显式转换为小数,并将小数隐式转换为 NSDecimal

使用这些运算符,您可以将以下代码作为实现目标的示例:

var nsDecimalNumber = new NSDecimalNumber("128.478", new NSLocale("en-US"));
var nsDecimal = nsDecimalNumber.NSDecimalValue;
var csharpDecimal = (decimal)nsDecimal;
var nsDecimalAfterConversion = (NSDecimal)csharpDecimal;
var nsDecimalNumberAfterConversion = new NSDecimalNumber(nsDecimalAfterConversion);
于 2021-07-21T11:41:15.663 回答