私は自分のアプリでdoubleを使って数学をやっています。これは、ピリオドを使用して小数を作成するシミュレーターでうまく機能します。ただし、iPhoneで実行すると、代わりにコンマが表示されます。カンマを使用しても何も起こりません。
カンマをピリオドと見なすように変更するか、キーボードを変更して(10進数パッドを使用している)、すべての言語でピリオドを入力できるようにするにはどうすればよいですか?
私は自分のアプリでdoubleを使って数学をやっています。これは、ピリオドを使用して小数を作成するシミュレーターでうまく機能します。ただし、iPhoneで実行すると、代わりにコンマが表示されます。カンマを使用しても何も起こりません。
カンマをピリオドと見なすように変更するか、キーボードを変更して(10進数パッドを使用している)、すべての言語でピリオドを入力できるようにするにはどうすればよいですか?
@propstmが言うように、異なるリージョン/ロケールは異なる番号区切り文字を使用します。 NSScannerは、テキストを数値タイプに変換するための標準フレームワーククラスであり、ユーザーの現在のロケールのすべての規則を考慮に入れています。テキスト入力からdoubleへの変換に使用する必要があります。
ただし、たとえば、米国ロケールでは$ 1,234.56が通貨の有効な値であるため、単にコンマをピリオドに置き換えるだけでは不十分です。カンマをピリオドに置き換えるだけでは、これは無効になります。
NSScannerを使用します。これは、それが特別に設計されたものです。
編集
でを使用することも検討しNSNumberFormatter
てくださいUITextField
。でスキャンする前に、ユーザー入力を検証するのに非常に役立ちますNSScanner
。 それをチェックしてください。
使用例NSNumberFormatter
:
viewControllerをUITextFieldのデリゲートとして設定し、次のメソッドを追加します。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *proposedNewValue = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
return (nil != [numberFormatter numberFromString:resultString]);
}
これにより、フィールドが不適切にフォーマットされた数値を受け入れないようになります。このメソッドを使用してNSNumber
、テキストからを取得することもできます。
使用NSScanner
するには、次のようなことを行うことができます。
- (IBAction)doStuff:(id)sender
{
NSString* entry = textField.text;
double value = 0;
if ([[NSScanner scannerWithString:entry] scanDouble: &value])
{
// If we get here, the scanning was successful
}
else
{
// Scanning failed -- couldn't parse the number... handle the error
}
}
HTH。
言語設定に基づいて、コンマが表示される場合とピリオドが表示される場合があります。
計算には、ユーザー入力を取り入れ、値を検証して、方程式に正しい形式が使用されていることを確認します。おそらく、コンマまたはピリオドの設定を保存してから、出力を再フォーマットして、ユーザーがフォーマットに慣れるようにします。
- (void)validateUserInputs{
for(UIControl *control in self.view.subviews){
if([control isMemberOfClass:[UITextField class]]){
NSString *convertedText = [[(UITextField *)control text] stringByReplacingOccurrencesOfString:@"," withString:@"."];
[(UITextField *)control setText:convertedText];
}
}
for(UIControl *control in self.view.subviews){
if([control isMemberOfClass:[UITextField class]]){
NSLog(@"Converted String Value: %@", [(UITextField *)control text]);
}
}
}