iOS 货币交易输入数字检测 小数点前面三位,小数点后允许两位,并且向上取整(无精度丢失问题)

来源:互联网 发布:网络歌手田力子 编辑:程序博客网 时间:2024/06/06 04:12

首先是数字检测 正则表达式 小数点前面三位,小数点后允许两位

Swift
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {        let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)        let expression = "^\\d{0,3}(\\.\\d{0,2})?$"        let regex = try! NSRegularExpression(pattern: expression, options: NSRegularExpression.Options.allowCommentsAndWhitespace)        let numberOfMatches = regex.numberOfMatches(in: newString, options:NSRegularExpression.MatchingOptions.reportProgress, range: NSMakeRange(0, (newString as NSString).length))        return numberOfMatches != 0    }



然后货币交易以及向上取整这里用到

NSDecimalNumberHandler

先定义一个枚举(Swift)
internal enum OperatorType{    //加    case addition    //减    case subtraction    //乘    case Multiplication    //除    case division}



货币计算并向上取整的方法


首先根据字符串初始化两个NSDecimalNumber对象
然后初始化NSDecimalNumberHandler为条件限制,比如保留小数点位数,向上取整,四舍五入等
参数介绍:

roundingMode:
    NSRoundPlain,   // Round up on a tie //这个暂时未尝试,大家可以自己试下

    NSRoundDown,    // Always down == truncate  //只舍不入

    NSRoundUp,      // Always up    // 只入不舍

    NSRoundBankers  // on a tie round so last digit is even  这个暂时未尝试,大家可以自己试下
scale:int类型,保留几位小数
raiseOnExactness:如果为true,如果发生精度(还是精确?)错误,则处理程序将引发异常,否则将忽略错误并将控制返回到调用方法。
raiseOnOverflow:如果为true,如果发生溢出错误,则处理程序将引发异常,否则将忽略错误并将控制返回到调用方法
raiseOnUnderflow: 如果为true,如果出现下溢错误,则处理程序将引发异常,否则将忽略错误并将控制返回到调用方法
raiseOnDivideByZero:如果为true,如果发生除以零错误 处理程序将引发异常,否则将忽略错误,并返回控制的调用方法

Objective - c代码
NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler                                       decimalNumberHandlerWithRoundingMode:NSRoundBankers                                       scale:2                                       raiseOnExactness:NO                                       raiseOnOverflow:NO                                       raiseOnUnderflow:NO                                       raiseOnDivideByZero:YES];


Swift 代码
let roundingBehavior = NSDecimalNumberHandler.init(                                                            roundingMode: NSDecimalNumber.RoundingMode.up,                                                           scale: Int16(position),                                                           raiseOnExactness: false,                                                           raiseOnOverflow: false,                                                           raiseOnUnderflow: false,                                                           raiseOnDivideByZero: false)


加减乘除方法(每个运算符有两个方法,从上到下是加减乘除,总共八个方法)




Objective-c
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;//这两个是加法- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;//减法- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;//乘法- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;//除法



Swift
    
    open func adding(_ decimalNumber: NSDecimalNumber) -> NSDecimalNumber    open func adding(_ decimalNumber: NSDecimalNumber, withBehavior behavior: NSDecimalNumberBehaviors?) -> NSDecimalNumber        open func subtracting(_ decimalNumber: NSDecimalNumber) -> NSDecimalNumber    open func subtracting(_ decimalNumber: NSDecimalNumber, withBehavior behavior: NSDecimalNumberBehaviors?) -> NSDecimalNumber        open func multiplying(by decimalNumber: NSDecimalNumber) -> NSDecimalNumber    open func multiplying(by decimalNumber: NSDecimalNumber, withBehavior behavior: NSDecimalNumberBehaviors?) -> NSDecimalNumber        open func dividing(by decimalNumber: NSDecimalNumber) -> NSDecimalNumber    open func dividing(by decimalNumber: NSDecimalNumber, withBehavior behavior: NSDecimalNumberBehaviors?) -> NSDecimalNumber






调用示例
    NSDecimalNumber *subtotal = [NSDecimalNumberdecimalNumberWithString:@"90.7049"];    NSDecimalNumber *discount = [NSDecimalNumberdecimalNumberWithString:@"0.22"];    NSDecimalNumber *total = [subtotal decimalNumberByAdding:discount withBehavior:roundUp];


最后附上源代码(Swift版)
////  XTYUtil.swift//  CreditBank////  Created by XuTianyu on 2017/3/20.//  Copyright © 2017年 lakala. All rights reserved.//import UIKitinternal enum OperatorType{    //加    case addition    //减    case subtraction    //乘    case Multiplication    //除    case division}class XTYUtil: NSObject {    /// 货币计算,向上取整    ///    /// - Parameters:    ///   - multiplierValue: value1    ///   - multiplicandValue: value2    ///   - position:需要保留的小数点位数    /// - Returns:保留好位数的字符串     internal class func decimalNumberWithString(multiplierValue:String,multiplicandValue:String,type:OperatorType, position:Int) -> String {                let multiplierNumber = NSDecimalNumber.init(string: multiplierValue)        let multiplicandNumber = NSDecimalNumber.init(string: multiplicandValue)                let roundingBehavior = NSDecimalNumberHandler.init(                                                            roundingMode: NSDecimalNumber.RoundingMode.up,                                                           scale: Int16(position),                                                           raiseOnExactness: false,                                                           raiseOnOverflow: false,                                                           raiseOnUnderflow: false,                                                           raiseOnDivideByZero: false)        var product : NSDecimalNumber        switch type {        case .addition:            product = multiplierNumber.adding(multiplicandNumber, withBehavior: roundingBehavior)            break        case .subtraction:            product = multiplierNumber.subtracting(multiplicandNumber, withBehavior: roundingBehavior)            break        case .Multiplication:            product = multiplierNumber.multiplying(by: multiplicandNumber, withBehavior: roundingBehavior)            break        default:            product = multiplierNumber.dividing(by: multiplicandNumber, withBehavior: roundingBehavior)            break        }        return String(format: "%.\(position)f", product.doubleValue)    }    }

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高血压200降不下去.怎么办 高血压吃药降不下来怎么办 合肥房子卖了户口怎么办 吃了粽子胃难受怎么办 突然血压高怎么办需要吃药吗? 胃一阵阵疼然后拉肚子怎么办 橱子和墙壁不平怎么办 复印选项是英文不认识怎么办 防盗门锁与门框结合不好怎么办 仿瓷涂料墙壁脏了怎么办 油笔画到墙纸上怎么办 水笔画在墙纸上怎么办 屋里有股石灰味怎么办 厨房太阳对着晒怎么办 房子有太阳西斜怎么办 房子晒到太阳很热怎么办 房子被太阳热了怎么办 房间西晒窗帘不遮光怎么办 新建房屋一面墙体有裂缝怎么办 卫生间地砖缝隙出现渗水怎么办 西户窗户太晒怎么办 西晒的墙面很烫怎么办 儿童房颜色太粉了怎么办? 小孩在家里偷钱怎么办 脾气不好的猫该怎么办 二年孩子偷钱怎么办 孩子偷钱2000报警怎么办? 我儿子十岁老是偷钱怎么办 13孩子偷同学钱怎么办 孩子偷同学的钱怎么办 儿子十四岁了老偷钱怎么办 发现初中生的儿子偷钱怎么办 被亲戚怀疑儿子偷钱怎么办 房门选的太白了怎么办 大厅地砖颜色比墙砖浅怎么办 房屋外墙渗水物业不管怎么办 走丢了怎么办教学反思 托班教案迷路了怎么办 大班安全教案遇到小偷怎么办 小班孩子舞台表演找不到位置怎么办 懂你英语学完了怎么办