十进制转换为低俗分数-需要帮助从Swift转换为Kotlin

问题描述

我发现了这个漂亮的十进制到分数函数:https://gist.github.com/natecook1000/9ecc976aaac9a035bddf

我已根据我的应用必要性对上述内容进行了操作,希望对制作Kotlin版本有所帮助。我确实曾经尝试过自己进行转换,但是我是一个新手编码人员,现在才在Kotlin呆了3个星期。我没有足够的经验在语言之间匹配语法和语义来自己完成所有工作。感谢帮助:)

我将以上内容更改为输出自定义Unicode输出,输出长度为16英寸(最初不包含16英寸)。我需要将其限制在输出的16分,8分,4分和1/2。

如果您不愿意进行完整的代码转换,则可以在十进制到小数转换器中使用特定功能。另外请注意,我在高处搜索了一个直接的Kotlin版本,但没有找到像该版本那样需要十进制输入和小数输出的版本。

主观意见警报:我喜欢Swift :) Kotlin很难学习。

我的Swift版本:

func vulgarFraction(number: Double) -> (String,Double) {
let fractions: [(String,Double)] = [("",1),("\(fifteenSixteenth)",15/16),("\u{215E}",7/8),("\(thirteenSixteenth)",13/16),("\u{00BE}",3/4),("\(elevelSixteenth)",11/16),("\u{215D}",5/8),("\(nineSixteenth)",9/16),("\u{00BD}",1/2),("\(sevenSixteenth)",7/16),("\u{215C}",3/8),("\(fiveSixteenth)",5/16),("\u{00BC}",1/4),("\(threeSixteenth)",3/16),("\u{215B}",1/8),("\(oneSixteenth)",1/16),("",0)]
let whole = Int(number)
let sign = whole < 0 ? -1 : 1
let fraction = number - Double(whole)

for i in 1..<fractions.count {
    if abs(fraction) > (fractions[i].1 + fractions[i - 1].1) / 2 {
        if fractions[i - 1].1 == 1.0 {
            return ("\(whole + sign)",Double(whole + sign))
        } else {
            return ("\(whole) \(fractions[i - 1].0)",Double(whole) + Double(sign) * 
fractions[i - 1].1)
        }
    }
}
return ("\(whole)",Double(whole))
}


let oneSixteenth: String = "\u{00B9}" + "/" + "\u{2081}" + "\u{2086}"
let threeSixteenth: String = "\u{00B3}" + "/" + "\u{2081}" + "\u{2086}"
let fiveSixteenth: String = "\u{2075}" + "/" + "\u{2081}" + "\u{2086}"
let sevenSixteenth: String = "\u{2077}" + "/" + "\u{2081}" + "\u{2086}"
let nineSixteenth: String = "\u{2079}" + "/" + "\u{2081}" + "\u{2086}"
let elevelSixteenth: String = "\u{00B9}" + "\u{00B9}" + "/" + "\u{2081}" + "\u{2086}"
let thirteenSixteenth: String = "\u{00B9}" + "\u{00B3}" + "/" + "\u{2081}" + "\u{2086}"
let fifteenSixteenth: String = "\u{00B9}" + "\u{2075}" + "/" + "\u{2081}" + "\u{2086}"

print(vulgarFraction(number: 4.4375))

到目前为止,我的尝试:

class DecimalFraction {

private val oneSixteenth = "\u00B9" += "/" += "\u2081" += "\u2086"
private val threeSixteenth = "\u00B3" + "/" + "\u2081" + "\u2086"
private val fiveSixteenth = "\u2075" + "/" + "\u2081" + "\u2086"
private val sevenSixteenth = "\u2077" + "/" + "\u2081" + "\u2086"
private val nineSixteenth = "\u2079" + "/" + "\u2081" + "\u2086"
private val elevenSixteenth = "\u00B9" + "\u00B9" + "/" + "\u2081" + "\u2086"
private val thirteenSixteenth = "\u00B9" + "\u00B3" + "/" + "\u2081" + "\u2086"
private val fifteenSixteenth = "\u00B9" + "\u2075" + "/" + "\u2081" + "\u2086"

fun vulgarFraction(number: Double): Pair<String,Double> {

val fractions = arrayOf(
    Pair("",Pair("$fifteenSixteenth",Pair("\u215E",Pair("$thirteenSixteenth",Pair("\u00BE",Pair("$elevenSixteenth",Pair("\u215D",Pair("$nineSixteenth",Pair("\u00BD",Pair("$sevenSixteenth",Pair("\u215C",Pair("$fiveSixteenth",Pair("\u00BC",Pair("$threeSixteenth",Pair("\u215B",Pair("$oneSixteenth",Pair("",0)
)

val whole = number.toInt()
val sign = whole < 0 ? -1 : 1 // KOTLIN DOES NOT LIKE THIS LINE
val fraction = number - whole.toDouble()

for (i in 1..fractions.count()) {
    if abs(fraction) > (fractions[i].1 + fractions[i - 1].1) / 2 {     // KOTLIN DOES NOT LIKE THIS FOR IN LOOP...
        if fractions[i - 1].1 == 1.0 {     // KOTLIN DOES NOT LIKE THIS FOR IN LOOP...
        return ("${whole + sign}",(whole + sign).toDouble)     // KOTLIN DOES NOT LIKE THIS FOR IN LOOP...
    } else {     // KOTLIN DOES NOT LIKE THIS FOR IN LOOP...
        return ("$whole" $fractions[i - 1].0,whole.toDouble + sign.toDouble * fractions[i - 1].1)     // KOTLIN DOES NOT LIKE THIS FOR IN LOOP...
    }
    }
}


return Pair("$whole",whole.toDouble())
}
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)