電卓の小数点以下処理が実装できたので、これに従ったオーバーフロー処理を実装してみました。
ここでは、数値を文字列として入れて、これが指定桁(初期値12桁)を超えているかどうかを判定し、0以上であれば小数点以下を処理した上で、オーバーフロー桁でピリオドを打ちます。0未満であれば小数点12桁未満の処理をして値を返します。
オーバーフロ・アンダーフローが起きたかどうかは、返り値のoverFlowフラグで返します。
まだ動かしていないのでこれでいいかどうかわかりませんが、とりあえずこのように設計してみました。さて、どうなることやら。
class Flow{
var queueDigit: Int
var overFlow: Bool
private let cut54up = CUT54UP.sharedCUT54UP
init(){
queueDigit = 12
overFlow = false
}
func checkOverFlow(_ input: String) -> (overFlow: Bool, retValString: String) {
var retnum = input
let dotRemoved = input.removeCharacters(from:".")
overFlow = dotRemoved.count > queueDigit
if overFlow {
if !(retnum.contains(".")) {
var startVal: Decimal
startVal = 1.0
for _ in 1 ... (dotRemoved.count - queueDigit) {
startVal = startVal * 0.1
}
var decimalNo = Decimal(string: retnum)! * startVal
retnum = NSDecimalNumber(decimal: decimalNo).stringValue
retnum = cut54up.change(retnum)
startVal = 1.0
for _ in 1 ... (retnum.count + queueDigit - dotRemoved.count) {
startVal = startVal * 0.1
}
decimalNo = Decimal(string: retnum)! * startVal
retnum = NSDecimalNumber(decimal: decimalNo).stringValue
print ("E")
}
}
else{
var startVal: Decimal
startVal = 1.0
for _ in 1 ... (queueDigit) {
startVal = startVal * 10
}
var decimalNo = Decimal(string: retnum)! * startVal
retnum = NSDecimalNumber(decimal: decimalNo).stringValue
retnum = cut54up.change(retnum)
decimalNo = Decimal(string: retnum)! / startVal
retnum = NSDecimalNumber(decimal: decimalNo).stringValue
}
return (overFlow, retnum)
}
}
ここでは、数値を文字列として入れて、これが指定桁(初期値12桁)を超えているかどうかを判定し、0以上であれば小数点以下を処理した上で、オーバーフロー桁でピリオドを打ちます。0未満であれば小数点12桁未満の処理をして値を返します。
オーバーフロ・アンダーフローが起きたかどうかは、返り値のoverFlowフラグで返します。
まだ動かしていないのでこれでいいかどうかわかりませんが、とりあえずこのように設計してみました。さて、どうなることやら。
0 件のコメント:
コメントを投稿