首頁>Program>source

在我的應用中,使用者需要能够輸入帶小數位的數值. iPhone没有提供专用於此目的的鍵盤-仅提供數字鍵盤和帶有數字和符號的鍵盤。

是否有一種簡單的方法来使用後者,並防止輸入任何非數字輸入而不必對最终結果进行正則表達式?

谢谢!

最新回復
  • 5月前
    1 #

    更優雅的解決方案也很簡單。

    您不需要小數點分隔键

    為什麼? 因為您可以簡單地从使用者輸入中推斷出它.例如,在美国語言環境中,当您輸入$ 1.23時,首先輸入數字1-2-3(按此順序).在系統中,輸入每个字元後,该字元將被識別為:

      user enters 1: $0.01

      user enters 2: $0.12

      user enters 3: $1.23

    請註意,我们如何根据使用者輸入来推斷小數點分隔符.現在,如果使用者想輸入1.00美元,他们只需輸入數字1-0-0。

    為了使您的代碼能够處理其他語言環境的货币,您需要获取货币的最大分數.可以使用以下代碼段完成此操作:

    NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
    [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    int currencyScale = [currencyFormatter maximumFractionDigits];
    

    例如,日元的最大分數為0。因此,在處理日元輸入時,没有小數點分隔符,因此甚至不必担心小數金額。

    這種解決問题的方法使您可以使用Apple提供的常規數字輸入鍵盤,而不必担心自定義鍵盤,正則表達式驗證等問题。

  • 5月前
    2 #

    我想指出一點 从iOS 4.1開始,您可以使用新的 UIKeyboardTypeDecimalPad

    所以現在您只需要:

    myTextField.keyboardType=UIKeyboardTypeDecimalPad;
    

  • 5月前
    3 #

    以下是接受的答案中建議的解決方案的示例.這不能處理其他货币或其他任何东西-就我而言,無論語言環境/货币是什麼,我都只需要美元支援,對我来說這是可以的:

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
        replacementString:(NSString *)string {
        double currentValue = [textField.text doubleValue];
        //Replace line above with this
        //double currentValue = [[textField text] substringFromIndex:1] doubleValue];
        double cents = round(currentValue * 100.0f);
        if ([string length]) {
            for (size_t i = 0; i < [string length]; i++) {
                unichar c = [string characterAtIndex:i];
                if (isnumber(c)) {
                    cents *= 10;
                    cents += c - '0'; 
                }            
            }
        } else {
            // back Space
            cents = floor(cents / 10);
        }
        textField.text = [NSString stringWithFormat:@"%.2f", cents / 100.0f];
        //Add this line
        //[textField setText:[NSString stringWithFormat:@"$%@",[textField text]]];
        return NO;
    }
    

    圆形和底線很重要a)由於浮點表示有時会丢失.00001或其他內容,並且b)格式字元串四舍五入我们在退格部分删除的精度。

  • 5月前
    4 #

    I 想要做完全一樣的事情,除了货币而不是直接的十进製值.

    我最终建立了一个包含UITextField和UILabel的自定義视圖.標簽覆盖了文字欄位,但是文字欄位仍然接收觸摸.我使用UITextFieldTextDidChange通知来观察文字欄位中的更改(並且使用NSNumberFormatter將結果數字轉換為格式化的货币值)来更新標簽。

    要禁用允许使用者重新放置插入點的放大镜,您將需要使用自定義UITextField子類並覆盖touchesBegan:withEvent:並將其設置為不執行任何操作。

    我的解決方案可能与您所需的解決方案有所不同,因為小數點始终是固定的-我使用系統的货币設置来確定小數點後應该有多少位數.但是,數字小鍵盤上没有小數點.而且您不能在鍵盤上添加任何按钮(這特別麻煩,因為在鍵盤的左下角有一个空白的按钮,非常適合小數點!)所以我對此没有解決方案

  • 5月前
    5 #

    根据特定的應用程式,在iPhone上提供一个供使用者選擇位置的滑塊可能是更好的選擇.然後,完全不需要輸入數字。

  • Android L&#39;s Ripple Effect:Android L的涟漪效應-按钮的觸摸反馈-使用XML
  • ios:自動佈局:removeFromSuperview / removeConstraints引發異常並嚴重崩潰