如何让NSNumberFormatter允许连字符?

时间:2015-09-16 00:31:33

标签: swift cocoa nstextfield nsnumberformatter nsformatter

我有NSTextField NSNumberFormatter来限制数字输入,但不允许我输入连字符输入负数(即使在设置"最小值&#34之后) ;到" -1,000")。

我可以复制/粘贴" -1 "进入字段并以编程方式设置其值,但用户无法输入连字符。

有没有办法允许这个?

感谢。

PS,这是我尝试的自定义格式化程序(没有成功),根据Nishant的建议如下:

import Cocoa

class CustomNumberFormatter: NSNumberFormatter {

    override func isPartialStringValid(partialStringPtr: AutoreleasingUnsafeMutablePointer<NSString?>,
        proposedSelectedRange proposedSelRangePtr: NSRangePointer, originalString origString: String,
        originalSelectedRange origSelRange: NSRange, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>) -> Bool {

            return true
    }

}

2 个答案:

答案 0 :(得分:0)

我知道这个问题很老,但我(我认为)能够使用 Nishant 的答案作为灵感来真正解决这个问题。我的解决方案如下。我覆盖了三种方法。这三个覆盖的原因如下:

  1. 使它成为一个单独的减号将被视为值 0。

  2. 如果用户字符串当前包含一个单独的减号,则将该减号作为字符串值而不是 0 返回。

  3. 使它能够接受一个单独的减号作为输入字符串。 (Nishant 最初提出的解决方案。)

NumberFormatterFix.h:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NumberFormatterFix : NSNumberFormatter
{
    BOOL minusSign;
}

- (BOOL)getObjectValue:(out id _Nullable * _Nullable)obj forString:(NSString *)string errorDescription:(out NSString * _Nullable * _Nullable)error;
- (nullable NSString *)stringForObjectValue:(nullable id)obj;
- (BOOL)isPartialStringValid:(NSString * _Nonnull * _Nonnull)partialStringPtr proposedSelectedRange:(nullable NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString * _Nullable * _Nullable)error;

@end


NS_ASSUME_NONNULL_END

NumberFormatterFix.m:

#import "NumberFormatterFix.h"

@implementation NumberFormatterFix

- (BOOL)getObjectValue:(out id _Nullable * _Nullable)obj forString:(NSString *)string errorDescription:(out NSString * _Nullable * _Nullable)error
{
    if ([string isEqualToString:@"-"])
    {
        minusSign = YES;
        *obj = [NSNumber numberWithDouble:0.0];
        return YES;
    }
    minusSign = NO;
    return [super getObjectValue:obj forString:string errorDescription:error];
}

- (nullable NSString *)stringForObjectValue:(nullable id)obj
{
    if (minusSign)
    {
        return @"-";
    }
    return [super stringForObjectValue:obj];
}

- (BOOL)isPartialStringValid:(NSString * _Nonnull * _Nonnull)partialStringPtr proposedSelectedRange:(nullable NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString * _Nullable * _Nullable)error
{
    if ([*partialStringPtr isEqualToString:@"-"])
    {
        return YES;
    }
    return [super isPartialStringValid:partialStringPtr proposedSelectedRange:proposedSelRangePtr originalString:origString originalSelectedRange:origSelRange errorDescription:error];
}

@end

答案 1 :(得分:-1)

子类NSNumberFormatter并实现此方法:

- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
              originalString:(NSString *)origString
       originalSelectedRange:(NSRange)origSelRange
            errorDescription:(NSString **)error

如果您的输入是您想要的有效数字/字符,请返回YES