TextFieldハックを使用せずに文字列を通貨にフォーマットする方法を探しています。
たとえば、「521242」という数字を「5,212.42」に変換したいのですが、1 $未満の数字がある場合は、「52」->「0.52」のようにしたいのですが
ありがとう
おそらくこのようなものが必要です(通貨がフロートであると仮定):
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:currency]];
52を.52として扱うための要件から、100.0で割る必要がある場合があります。
このアプローチの良い点は、現在のロケールを尊重することです。したがって、必要に応じて、サンプルを「5.212,42」としてフォーマットします。
更新: 私はおそらく、私の例を投稿するのに少し速かったです。以下のコンラッド・シュルツが指摘したように、通貨額を扱うときは、数量をNSDecimalNumber
sとして保存することが望ましいでしょう。これにより、丸め誤差による頭痛が大幅に軽減されます。これを行うと、上記のコードスニペットは(通貨がNSDecimalNumber*
):
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
NSString *numberAsString = [numberFormatter stringFromNumber:currency];
このコードを使用します。私のためのこの仕事
1)ヘッダーファイルにUITextFieldデリゲートを追加します
2)このコードを追加(ARC有効)
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *cleanCentString = [[textField.text
componentsSeparatedByCharactersInSet:
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
componentsJoinedByString:@""];
// Parse final integer value
NSInteger centAmount = cleanCentString.integerValue;
// Check the user input
if (string.length > 0)
{
// Digit added
centAmount = centAmount * 10 + string.integerValue;
}
else
{
// Digit deleted
centAmount = centAmount / 10;
}
// Update call amount value
NSNumber *amount = [[NSNumber alloc] initWithFloat:(float)centAmount / 100.0f];
// Write amount with currency symbols to the textfield
NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init];
[_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[_currencyFormatter setCurrencyCode:@"USD"];
[_currencyFormatter setNegativeFormat:@"-¤#,##0.00"];
textField.text = [_currencyFormatter stringFromNumber:amount];
return NO; }
Swift 2.0バージョン:
let _currencyFormatter : NSNumberFormatter = NSNumberFormatter()
_currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
_currencyFormatter.currencyCode = "EUR"
textField.text = _currencyFormatter.stringFromNumber(amount);
次のコードを使用すると、すべての問題が解決されます。..
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:[currency doubleValue]]];
これは、NSDecimalNumbersを使用してAAVの答えを作り直したことです。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *cleanCentString = [[textField.text
componentsSeparatedByCharactersInSet:
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
componentsJoinedByString:@""];
// Parse final integer value
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithMantissa:[cleanCentString integerValue]
exponent:-2
isNegative:NO];
NSDecimalNumber *entry = [NSDecimalNumber decimalNumberWithMantissa:[string integerValue]
exponent:-2
isNegative:NO];
NSDecimalNumber *multiplier = [NSDecimalNumber decimalNumberWithMantissa:1
exponent:1
isNegative:NO];
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:2
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
NSDecimalNumber *result;
// Check the user input
if (string.length > 0)
{
// Digit added
result = [price decimalNumberByMultiplyingBy:multiplier withBehavior:handler];
result = [result decimalNumberByAdding:entry];
}
else
{
// Digit deleted
result = [price decimalNumberByDividingBy:multiplier withBehavior:handler];
}
// Write amount with currency symbols to the textfield
NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init];
[_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[_currencyFormatter setCurrencyCode:@"USD"];
textField.text = [_currencyFormatter stringFromNumber:result];
return NO;
}
For Swiftテスト済みコード(AAVのコードからの参照)
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{
let strMain : NSString = string
let arrTemp : NSArray = (textField.text?.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))!
let str: NSString = arrTemp.componentsJoinedByString("")
//NSInteger centAmount = cleanCentString.integerValue;
var centAmount : NSInteger = str.integerValue
if (string.length > 0)
{
// Digit added
centAmount = centAmount * 10 + strMain.integerValue;
}
else {
// Digit deleted
centAmount = centAmount / 10;
}
let amount = (Double(centAmount) / 100.0)
let currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = .CurrencyStyle
currencyFormatter.currencyCode = "USD"
currencyFormatter.negativeFormat = "-¤#,##0.00"
let convertedPrice = currencyFormatter.stringFromNumber(amount)
print(convertedPrice)
txtAmount.text = convertedPrice! //set text to your textfiled
return false //return false for exact out put
}
注:入力からデフォルトの通貨記号を削除する場合は、currencySymbolを使用して以下のように空白にすることができます
currencyFormatter.currencyCode = nil
currencyFormatter.currencySymbol = ""
ハッピーコーディング!
func getCurrencyFormat(price:String)->String{
let convertPrice = NSNumber(double: Double(price)!)
let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.currencyCode = "USD"
let convertedPrice = formatter.stringFromNumber(convertPrice)
return convertedPrice!
}
注:-通貨コードは3文字のコードで、ほとんどの場合、国の2文字のインターネット国コードと通貨単位を示す追加の文字で構成されています。たとえば、オーストラリアドルの通貨コードは「AUD」です。