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 として保存することが望ましいでしょう。これにより、丸め誤差による頭痛が大幅に軽減されます。これを行うと、上記のコード スニペットは次のようになります (通貨が a であると仮定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; }
迅速な 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;
}
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」です。
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 = ""
ハッピーコーディング!