Получение NSDecimalNumber от локали определенная строка?

Вы можете настроить внешнее соединение только в Azure SQL Хранилище данных .

В документации говорится, что она применима к базе данных SQL Azure, но это вводит в заблуждение, механизмом, обеспечивающим эту функцию, является Polybase, и он доступен только в SQL DW для SQL Server 2016+ (IaaS или прет).

Если вы прочитаете страницу документации, вы найдете заметку:

PolyBase поддерживается только в SQL Server 2016 (или более поздней версии), хранилище данных SQL Azure и хранилище параллельных данных. Запросы к базе данных Elastic поддерживаются только в базе данных SQL Azure версии 12 или новее.

BLOCKQUOTE>

15
задан shek 3 August 2009 в 13:06
поделиться

3 ответа

На основе ответа Boaz Stuller я зарегистрировал ошибку к Apple для этой проблемы. Пока это не разрешено, вот обходные решения, которые я выбрал как являющийся лучшим подходом для взятия. Эти обходные решения просто полагаются на округление десятичного числа к соответствующей точности, которая является простым подходом, который может добавить Ваш существующий код (вместо того, чтобы переключиться со средств форматирования на сканеры).

Общие числа

По существу я просто округляю число на основе правил, которые имеют смысл для моей ситуации. Так, YMMV в зависимости от точности Вы поддерживаете.

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setGeneratesDecimalNumbers:TRUE];

NSString *s = @"0.07";

// Create your desired rounding behavior that is appropriate for your situation
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE]; 

NSDecimalNumber *decimalNumber = [formatter numberFromString:s];
NSDecimalNumber *roundedDecimalNumber = [decimalNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

NSLog([decimalNumber stringValue]); // prints 0.07000000000000001
NSLog([roundedDecimalNumber stringValue]); // prints 0.07

Валюты

Обработка валют (который является фактической проблемой, которую я пытаюсь решить) является просто небольшой вариацией на обработку общих чисел. Ключ - то, что масштаб округляющегося поведения определяется максимальными дробными цифрами, используемыми валютой локали.

NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[currencyFormatter setGeneratesDecimalNumbers:TRUE];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

// Here is the key: use the maximum fractional digits of the currency as the scale
int currencyScale = [currencyFormatter maximumFractionDigits];

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE]; 

// image s is some locale specific currency string (eg, $0.07 or €0.07)
NSDecimalNumber *decimalNumber = (NSDecimalNumber*)[currencyFormatter numberFromString:s];
NSDecimalNumber *roundedDecimalNumber = [decimalNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

NSLog([decimalNumber stringValue]); // prints 0.07000000000000001
NSLog([roundedDecimalNumber stringValue]); // prints 0.07
13
ответ дан 1 December 2019 в 01:31
поделиться

Это, кажется, работает:

NSString *s = @"0.07";

NSScanner* scanner = [NSScanner localizedScannerWithString:s];
NSDecimal decimal;
[scanner scanDecimal:&decimal];
NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithDecimal:decimal];

NSLog([decimalNumber stringValue]); // prints 0.07

Кроме того, зарегистрируйте ошибку на этом. Это - определенно не корректное поведение, которое Вы видите там.

Править: Пока Apple не фиксирует это (и затем каждый потенциальный пользователь обновления фиксированной версии OSX), Вы, вероятно, оказываетесь перед необходимостью синтаксический анализатор самокрутки с помощью NSScanner или принимаете 'только' двойную точность для введенных номеров. Если Вы не планируете иметь бюджет Пентагона в этом приложении, я предложил бы последнего. Реалистично, удваивается, с точностью до 14 десятичных разрядов, таким образом, в чем-либо меньше чем триллион долларов, они будут меньше чем пенсом прочь. Я должен был записать свои собственные стандартные программы парсинга даты на основе NSDateFormatter для проекта, и я провел буквально месяц, обрабатывая все забавные пограничные случаи, (как то, как только Швеция имеет день недели, включенной в ее отдаленный срок).

4
ответ дан 1 December 2019 в 01:31
поделиться

См. также Лучший способ сохранить значения валюты в C++

Лучший способ обработать валюту состоит в том, чтобы использовать целочисленное значение для самой маленькой единицы валюты, т.е. центов за доллары/евро, и т.д. Вы избежите любых связанных с плавающей точкой ошибок точности в своем коде.

Имея это в виду, лучший способ проанализировать строки, содержащие значение валюты, состоит в том, чтобы сделать это вручную (с настраиваемым символом десятичной точки). Разделите строку в десятичной точке и проанализируйте и первую и вторую часть как целочисленные значения. Затем используйте, создают Вашу общую стоимость от тех.

0
ответ дан 1 December 2019 в 01:31
поделиться