在这里插入图片描述

目录

  1. 概述
  2. 工具功能
  3. 核心实现
  4. Kotlin 源代码
  5. JavaScript 编译代码
  6. ArkTS 调用代码
  7. 实战案例
  8. 最佳实践

概述

本文档介绍如何在 Kotlin Multiplatform (KMP) 鸿蒙跨端开发中实现一个功能完整的体重单位转换工具系统。体重是衡量物体质量的重要指标,在日常生活、健身管理、医疗诊断、食品营养等领域都有广泛应用。这个工具提供了对多种体重单位的全面转换支持,包括公制单位(克、千克)和英制单位(盎司、磅)等,以及体重转换的各种操作和分析。

在实际应用中,体重转换工具广泛应用于以下场景:健身应用、营养管理、医疗设备、食品标签、国际贸易、体重管理等。通过 KMP 框架的跨端能力,我们可以在不同平台上使用相同的体重转换逻辑,确保转换结果的准确性和一致性。

工具的特点

  • 完整的体重单位支持:支持公制和英制单位的相互转换
  • 精确的转换:使用标准的体重转换系数
  • 双向转换:支持任意两种体重单位之间的转换
  • 体重范围检查:检查体重值是否在合理范围内
  • 体重分析:提供体重数据的详细分析
  • 跨端兼容:一份 Kotlin 代码可同时服务多个平台

工具功能

1. 公制体重单位转换

公制体重单位是国际标准单位,基于 10 进制。克和千克是最常见的公制体重单位。公制体重转换需要处理小数点精度和单位之间的倍数关系。

  • 克到千克:1 kg = 1000 g
  • 毫克到克:1 g = 1000 mg
  • 吨到千克:1 t = 1000 kg
  • 跨单位转换:支持任意两个公制单位之间的转换

2. 英制体重单位转换

英制体重单位主要在美国和英国使用。盎司、磅、英石是主要的英制体重单位。英制体重转换需要处理复杂的倍数关系。

  • 盎司到磅:1 lb = 16 oz
  • 磅到英石:1 st = 14 lb
  • 英石到磅:1 st = 14 lb
  • 跨单位转换:支持任意两个英制单位之间的转换

3. 公制与英制转换

公制和英制之间的转换需要使用标准的转换系数。这对于国际应用很重要。

  • 克到盎司:1 oz = 28.3495 g
  • 千克到磅:1 lb = 0.453592 kg
  • 精确转换:使用标准的国际转换系数
  • 双向转换:支持两个方向的转换

4. 体重范围检查

体重范围检查是验证体重值是否在合理范围内。不同的应用有不同的体重范围。体重范围检查对于数据质量控制很重要。

  • 正数检查:体重必须为正数
  • 合理范围检查:检查体重是否在常见范围内
  • 单位验证:检查体重单位是否有效
  • 错误报告:提供详细的错误信息

5. 体重描述和分类

体重描述是用自然语言描述体重的大小。体重分类是根据体重范围进行分类。体重描述和分类对于用户界面很有用。

  • 体重等级:极轻、很轻、轻、中等、重、很重、极重
  • 体重评价:根据体重生成评价
  • 应用场景:根据体重推荐应用场景
  • 参考对象:提供体重的参考对象

6. 体重统计分析

体重统计分析是对体重数据进行统计和分析。体重统计分析对于健身管理和数据处理很有用。

  • 最大体重:找出最大的体重
  • 最小体重:找出最小的体重
  • 平均体重:计算体重的平均值
  • 体重分布:分析体重的分布

7. 体重转换历史

体重转换历史是记录之前的转换操作。体重转换历史对于用户查看和重复使用很有用。

  • 转换记录:记录所有的转换操作
  • 快速重复:快速重复之前的转换
  • 历史查询:查询之前的转换结果
  • 导出数据:导出转换历史

核心实现

1. 公制体重转换

fun milligramToGram(mg: Double): Double = mg / 1000
fun gramToKilogram(g: Double): Double = g / 1000
fun kilogramToTon(kg: Double): Double = kg / 1000

fun gramToMilligram(g: Double): Double = g * 1000
fun kilogramToGram(kg: Double): Double = kg * 1000
fun tonToKilogram(t: Double): Double = t * 1000

fun convertMetric(value: Double, fromUnit: String, toUnit: String): Double {
    val grams = when (fromUnit.lowercase()) {
        "mg" -> milligramToGram(value)
        "g" -> value
        "kg" -> kilogramToGram(value)
        "t" -> tonToKilogram(value)
        else -> 0.0
    }
    
    return when (toUnit.lowercase()) {
        "mg" -> gramToMilligram(grams)
        "g" -> grams
        "kg" -> gramToKilogram(grams)
        "t" -> grams / 1000000
        else -> 0.0
    }
}

代码说明: 公制体重转换通过克作为标准单位。先将源单位转换为克,再转换为目标单位。这种方法简洁且易于维护。

2. 英制体重转换

fun ounceToGram(oz: Double): Double = oz * 28.3495
fun poundToGram(lb: Double): Double = lb * 453.592
fun stoneToGram(st: Double): Double = st * 6350.29

fun gramToOunce(g: Double): Double = g / 28.3495
fun gramToPound(g: Double): Double = g / 453.592
fun gramToStone(g: Double): Double = g / 6350.29

fun convertImperial(value: Double, fromUnit: String, toUnit: String): Double {
    val grams = when (fromUnit.lowercase()) {
        "oz" -> ounceToGram(value)
        "lb" -> poundToGram(value)
        "st" -> stoneToGram(value)
        else -> 0.0
    }
    
    return when (toUnit.lowercase()) {
        "oz" -> gramToOunce(grams)
        "lb" -> gramToPound(grams)
        "st" -> gramToStone(grams)
        else -> 0.0
    }
}

代码说明: 英制体重转换通过克作为标准单位。先将源单位转换为克,再转换为目标单位。这种方法统一了英制单位的转换。

3. 体重验证

fun validateWeight(weight: Double): Pair<Boolean, String> {
    return if (weight < 0) {
        Pair(false, "体重不能为负数")
    } else if (weight > 1000) {
        Pair(false, "体重超出合理范围")
    } else {
        Pair(true, "体重有效")
    }
}

代码说明: 体重验证检查体重是否为正数且在合理范围内。这确保了数据的有效性。

4. 体重描述

fun describeWeight(grams: Double): String {
    val kg = grams / 1000
    return when {
        kg < 0.5 -> "极轻,婴儿级别"
        kg < 5 -> "很轻,幼儿级别"
        kg < 20 -> "轻,儿童级别"
        kg < 50 -> "中等,青少年级别"
        kg < 80 -> "重,成人级别"
        kg < 120 -> "很重,超重级别"
        else -> "极重,肥胖级别"
    }
}

fun getWeightEmoji(grams: Double): String {
    val kg = grams / 1000
    return when {
        kg < 5 -> "👶"
        kg < 20 -> "🧒"
        kg < 50 -> "👦"
        kg < 80 -> "👨"
        kg < 120 -> "🏋️"
        else -> "⚖️"
    }
}

代码说明: 体重描述根据千克的范围提供自然语言描述。通过使用 emoji,可以提供更加直观的体重表示。

5. 体重统计分析

fun analyzeWeights(weights: List<Double>, unit: String): Map<String, Any> {
    if (weights.isEmpty()) return mapOf("error" to "体重列表为空")
    
    val stats = mutableMapOf<String, Any>()
    stats["count"] = weights.size
    stats["max"] = weights.maxOrNull() ?: 0.0
    stats["min"] = weights.minOrNull() ?: 0.0
    stats["average"] = String.format("%.2f", weights.average())
    
    val sorted = weights.sorted()
    stats["median"] = if (weights.size % 2 == 0) {
        (sorted[weights.size / 2 - 1] + sorted[weights.size / 2]) / 2
    } else {
        sorted[weights.size / 2]
    }
    
    stats["unit"] = unit
    
    return stats
}

代码说明: 体重统计分析计算多个统计指标,包括最大值、最小值、平均值、中位数等。这对于分析体重数据很有用。


Kotlin 源代码

// WeightConverter.kt

class WeightConverter {
    
    // 公制转换
    fun milligramToGram(mg: Double): Double = mg / 1000
    fun gramToKilogram(g: Double): Double = g / 1000
    fun kilogramToTon(kg: Double): Double = kg / 1000
    
    fun gramToMilligram(g: Double): Double = g * 1000
    fun kilogramToGram(kg: Double): Double = kg * 1000
    fun tonToKilogram(t: Double): Double = t * 1000
    
    // 英制转换
    fun ounceToGram(oz: Double): Double = oz * 28.3495
    fun poundToGram(lb: Double): Double = lb * 453.592
    fun stoneToGram(st: Double): Double = st * 6350.29
    
    fun gramToOunce(g: Double): Double = g / 28.3495
    fun gramToPound(g: Double): Double = g / 453.592
    fun gramToStone(g: Double): Double = g / 6350.29
    
    fun convertMetric(value: Double, fromUnit: String, toUnit: String): Double {
        val grams = when (fromUnit.lowercase()) {
            "mg" -> milligramToGram(value)
            "g" -> value
            "kg" -> kilogramToGram(value)
            "t" -> tonToKilogram(value)
            else -> 0.0
        }
        
        return when (toUnit.lowercase()) {
            "mg" -> gramToMilligram(grams)
            "g" -> grams
            "kg" -> gramToKilogram(grams)
            "t" -> grams / 1000000
            else -> 0.0
        }
    }
    
    fun convertImperial(value: Double, fromUnit: String, toUnit: String): Double {
        val grams = when (fromUnit.lowercase()) {
            "oz" -> ounceToGram(value)
            "lb" -> poundToGram(value)
            "st" -> stoneToGram(value)
            else -> 0.0
        }
        
        return when (toUnit.lowercase()) {
            "oz" -> gramToOunce(grams)
            "lb" -> gramToPound(grams)
            "st" -> gramToStone(grams)
            else -> 0.0
        }
    }
    
    fun convertBetweenSystems(value: Double, fromUnit: String, toUnit: String): Double {
        val grams = when (fromUnit.lowercase()) {
            "mg", "g", "kg", "t" -> convertMetric(value, fromUnit, "g")
            "oz" -> ounceToGram(value)
            "lb" -> poundToGram(value)
            "st" -> stoneToGram(value)
            else -> 0.0
        }
        
        return when (toUnit.lowercase()) {
            "mg", "g", "kg", "t" -> convertMetric(grams, "g", toUnit)
            "oz" -> gramToOunce(grams)
            "lb" -> gramToPound(grams)
            "st" -> gramToStone(grams)
            else -> 0.0
        }
    }
    
    fun validateWeight(weight: Double): Pair<Boolean, String> {
        return if (weight < 0) {
            Pair(false, "体重不能为负数")
        } else if (weight > 1000) {
            Pair(false, "体重超出合理范围")
        } else {
            Pair(true, "体重有效")
        }
    }
    
    fun describeWeight(grams: Double): String {
        val kg = grams / 1000
        return when {
            kg < 0.5 -> "极轻,婴儿级别"
            kg < 5 -> "很轻,幼儿级别"
            kg < 20 -> "轻,儿童级别"
            kg < 50 -> "中等,青少年级别"
            kg < 80 -> "重,成人级别"
            kg < 120 -> "很重,超重级别"
            else -> "极重,肥胖级别"
        }
    }
    
    fun getWeightEmoji(grams: Double): String {
        val kg = grams / 1000
        return when {
            kg < 5 -> "👶"
            kg < 20 -> "🧒"
            kg < 50 -> "👦"
            kg < 80 -> "👨"
            kg < 120 -> "🏋️"
            else -> "⚖️"
        }
    }
    
    fun analyzeWeights(weights: List<Double>, unit: String): Map<String, Any> {
        if (weights.isEmpty()) return mapOf("error" to "体重列表为空")
        
        val stats = mutableMapOf<String, Any>()
        stats["count"] = weights.size
        stats["max"] = weights.maxOrNull() ?: 0.0
        stats["min"] = weights.minOrNull() ?: 0.0
        stats["average"] = String.format("%.2f", weights.average())
        
        val sorted = weights.sorted()
        stats["median"] = if (weights.size % 2 == 0) {
            (sorted[weights.size / 2 - 1] + sorted[weights.size / 2]) / 2
        } else {
            sorted[weights.size / 2]
        }
        
        stats["unit"] = unit
        
        return stats
    }
    
    fun formatWeight(weight: Double, unit: String, decimals: Int = 2): String {
        return String.format("%.${decimals}f $unit", weight)
    }
    
    fun getUnitInfo(unit: String): Map<String, String> {
        return when (unit.lowercase()) {
            "mg" -> mapOf("name" to "毫克", "system" to "公制", "symbol" to "mg")
            "g" -> mapOf("name" to "克", "system" to "公制", "symbol" to "g")
            "kg" -> mapOf("name" to "千克", "system" to "公制", "symbol" to "kg")
            "t" -> mapOf("name" to "吨", "system" to "公制", "symbol" to "t")
            "oz" -> mapOf("name" to "盎司", "system" to "英制", "symbol" to "oz")
            "lb" -> mapOf("name" to "磅", "system" to "英制", "symbol" to "lb")
            "st" -> mapOf("name" to "英石", "system" to "英制", "symbol" to "st")
            else -> mapOf("error" to "不支持的体重单位")
        }
    }
}

fun main() {
    val converter = WeightConverter()
    
    println("=== 体重单位转换工具演示 ===\n")
    
    // 公制转换
    val g = 1000.0
    println("$g g 转换:")
    println("  千克: ${converter.convertMetric(g, "g", "kg")} kg")
    println("  毫克: ${converter.convertMetric(g, "g", "mg")} mg\n")
    
    // 英制转换
    val lb = 10.0
    println("$lb lb 转换:")
    println("  盎司: ${converter.convertImperial(lb, "lb", "oz")} oz")
    println("  英石: ${converter.convertImperial(lb, "lb", "st")} st\n")
    
    // 公制与英制转换
    println("1000 g 转磅: ${converter.convertBetweenSystems(1000.0, "g", "lb")} lb")
    println("10 lb 转千克: ${converter.convertBetweenSystems(10.0, "lb", "kg")} kg\n")
    
    // 体重描述
    val grams = converter.convertMetric(70.0, "kg", "g")
    println("${grams / 1000}kg 的描述: ${converter.describeWeight(grams)} ${converter.getWeightEmoji(grams)}")
}

Kotlin 代码说明: 这个实现提供了完整的体重转换功能。WeightConverter 类包含了公制转换、英制转换、系统间转换、验证、描述、分析等多个方法。通过使用标准的体重转换系数,确保了转换的准确性。


JavaScript 编译代码

// WeightConverter.js
class WeightConverter {
    // 公制转换
    milligramToGram(mg) { return mg / 1000; }
    gramToKilogram(g) { return g / 1000; }
    kilogramToTon(kg) { return kg / 1000; }
    
    gramToMilligram(g) { return g * 1000; }
    kilogramToGram(kg) { return kg * 1000; }
    tonToKilogram(t) { return t * 1000; }
    
    // 英制转换
    ounceToGram(oz) { return oz * 28.3495; }
    poundToGram(lb) { return lb * 453.592; }
    stoneToGram(st) { return st * 6350.29; }
    
    gramToOunce(g) { return g / 28.3495; }
    gramToPound(g) { return g / 453.592; }
    gramToStone(g) { return g / 6350.29; }
    
    convertMetric(value, fromUnit, toUnit) {
        let grams;
        switch (fromUnit.toLowerCase()) {
            case "mg": grams = this.milligramToGram(value); break;
            case "g": grams = value; break;
            case "kg": grams = this.kilogramToGram(value); break;
            case "t": grams = this.tonToKilogram(value); break;
            default: grams = 0;
        }
        
        switch (toUnit.toLowerCase()) {
            case "mg": return this.gramToMilligram(grams);
            case "g": return grams;
            case "kg": return this.gramToKilogram(grams);
            case "t": return grams / 1000000;
            default: return 0;
        }
    }
    
    convertImperial(value, fromUnit, toUnit) {
        let grams;
        switch (fromUnit.toLowerCase()) {
            case "oz": grams = this.ounceToGram(value); break;
            case "lb": grams = this.poundToGram(value); break;
            case "st": grams = this.stoneToGram(value); break;
            default: grams = 0;
        }
        
        switch (toUnit.toLowerCase()) {
            case "oz": return this.gramToOunce(grams);
            case "lb": return this.gramToPound(grams);
            case "st": return this.gramToStone(grams);
            default: return 0;
        }
    }
    
    convertBetweenSystems(value, fromUnit, toUnit) {
        let grams;
        switch (fromUnit.toLowerCase()) {
            case "mg":
            case "g":
            case "kg":
            case "t":
                grams = this.convertMetric(value, fromUnit, "g");
                break;
            case "oz": grams = this.ounceToGram(value); break;
            case "lb": grams = this.poundToGram(value); break;
            case "st": grams = this.stoneToGram(value); break;
            default: grams = 0;
        }
        
        switch (toUnit.toLowerCase()) {
            case "mg":
            case "g":
            case "kg":
            case "t":
                return this.convertMetric(grams, "g", toUnit);
            case "oz": return this.gramToOunce(grams);
            case "lb": return this.gramToPound(grams);
            case "st": return this.gramToStone(grams);
            default: return 0;
        }
    }
    
    validateWeight(weight) {
        if (weight < 0) {
            return { valid: false, message: "体重不能为负数" };
        } else if (weight > 1000) {
            return { valid: false, message: "体重超出合理范围" };
        }
        return { valid: true, message: "体重有效" };
    }
    
    describeWeight(grams) {
        const kg = grams / 1000;
        if (kg < 0.5) return "极轻,婴儿级别";
        if (kg < 5) return "很轻,幼儿级别";
        if (kg < 20) return "轻,儿童级别";
        if (kg < 50) return "中等,青少年级别";
        if (kg < 80) return "重,成人级别";
        if (kg < 120) return "很重,超重级别";
        return "极重,肥胖级别";
    }
    
    getWeightEmoji(grams) {
        const kg = grams / 1000;
        if (kg < 5) return "👶";
        if (kg < 20) return "🧒";
        if (kg < 50) return "👦";
        if (kg < 80) return "👨";
        if (kg < 120) return "🏋️";
        return "⚖️";
    }
    
    analyzeWeights(weights, unit) {
        if (weights.length === 0) return { error: "体重列表为空" };
        
        const stats = {};
        stats.count = weights.length;
        stats.max = Math.max(...weights);
        stats.min = Math.min(...weights);
        stats.average = (weights.reduce((a, b) => a + b, 0) / weights.length).toFixed(2);
        
        const sorted = [...weights].sort((a, b) => a - b);
        stats.median = weights.length % 2 === 0 ?
            (sorted[weights.length / 2 - 1] + sorted[weights.length / 2]) / 2 :
            sorted[Math.floor(weights.length / 2)];
        
        stats.unit = unit;
        
        return stats;
    }
    
    formatWeight(weight, unit, decimals = 2) {
        return weight.toFixed(decimals) + " " + unit;
    }
    
    getUnitInfo(unit) {
        switch (unit.toLowerCase()) {
            case "mg": return { name: "毫克", system: "公制", symbol: "mg" };
            case "g": return { name: "克", system: "公制", symbol: "g" };
            case "kg": return { name: "千克", system: "公制", symbol: "kg" };
            case "t": return { name: "吨", system: "公制", symbol: "t" };
            case "oz": return { name: "盎司", system: "英制", symbol: "oz" };
            case "lb": return { name: "磅", system: "英制", symbol: "lb" };
            case "st": return { name: "英石", system: "英制", symbol: "st" };
            default: return { error: "不支持的体重单位" };
        }
    }
}

// 使用示例
const converter = new WeightConverter();

console.log("=== 体重单位转换工具演示 ===\n");

const g = 1000;
console.log(`${g} g 转换:`);
console.log("  千克:", converter.convertMetric(g, "g", "kg"), "kg");
console.log("  毫克:", converter.convertMetric(g, "g", "mg"), "mg");

const lb = 10;
console.log(`\n${lb} lb 转换:`);
console.log("  盎司:", converter.convertImperial(lb, "lb", "oz"), "oz");
console.log("  英石:", converter.convertImperial(lb, "lb", "st"), "st");

console.log("\n1000 g 转磅:", converter.convertBetweenSystems(1000, "g", "lb"), "lb");
console.log("10 lb 转千克:", converter.convertBetweenSystems(10, "lb", "kg"), "kg");

const grams = converter.convertMetric(70, "kg", "g");
console.log(`\n${grams / 1000}kg 的描述: ${converter.describeWeight(grams)} ${converter.getWeightEmoji(grams)}`);

JavaScript 代码说明: JavaScript 版本是 Kotlin 代码的直接转译。由于 JavaScript 和 Kotlin 在语法上有差异,我们使用 switch 语句替代 when 表达式。整体逻辑和算法与 Kotlin 版本保持一致。


ArkTS 调用代码

// WeightConverterPage.ets
import { WeightConverter } from './WeightConverter';

@Entry
@Component
struct WeightConverterPage {
    @State inputValue: string = '70';
    @State fromUnit: string = 'kg';
    @State toUnit: string = 'lb';
    @State result: string = '';
    @State showResult: boolean = false;
    @State isLoading: boolean = false;
    @State operationType: string = 'convert';
    
    private converter: WeightConverter = new WeightConverter();
    
    private unitOptions = [
        { label: '毫克 (mg)', value: 'mg' },
        { label: '克 (g)', value: 'g' },
        { label: '千克 (kg)', value: 'kg' },
        { label: '吨 (t)', value: 't' },
        { label: '盎司 (oz)', value: 'oz' },
        { label: '磅 (lb)', value: 'lb' },
        { label: '英石 (st)', value: 'st' }
    ];
    
    private operationOptions = [
        { label: '体重转换', value: 'convert' },
        { label: '体重验证', value: 'validate' },
        { label: '体重描述', value: 'describe' },
        { label: '单位信息', value: 'info' }
    ];
    
    performOperation() {
        this.isLoading = true;
        try {
            let resultText = '';
            const weight = parseFloat(this.inputValue);
            
            switch (this.operationType) {
                case 'convert':
                    const convertResult = this.converter.convertBetweenSystems(weight, this.fromUnit, this.toUnit);
                    resultText = `${weight} ${this.fromUnit} = ${convertResult.toFixed(4)} ${this.toUnit}`;
                    break;
                case 'validate':
                    const validation = this.converter.validateWeight(weight);
                    resultText = validation.valid ? '✓ ' + validation.message : '✗ ' + validation.message;
                    break;
                case 'describe':
                    let grams = weight;
                    if (this.fromUnit !== 'g') {
                        grams = this.converter.convertBetweenSystems(weight, this.fromUnit, 'g');
                    }
                    const description = this.converter.describeWeight(grams);
                    const emoji = this.converter.getWeightEmoji(grams);
                    resultText = `${emoji} ${description}`;
                    break;
                case 'info':
                    const info = this.converter.getUnitInfo(this.fromUnit);
                    resultText = `📊 ${info.name} 信息\n`;
                    resultText += `━━━━━━━━━━━━━━━━━━━━━\n`;
                    resultText += `符号: ${info.symbol}\n`;
                    resultText += `系统: ${info.system}`;
                    break;
                default:
                    resultText = '未知操作';
            }
            
            this.result = resultText;
            this.showResult = true;
        } catch (error) {
            this.result = '操作失败: ' + (error instanceof Error ? error.message : String(error));
            this.showResult = true;
        } finally {
            this.isLoading = false;
        }
    }
    
    build() {
        Column() {
            // 标题
            Text('体重单位转换工具')
                .fontSize(28)
                .fontWeight(FontWeight.Bold)
                .margin({ top: 20, bottom: 20 })
                .textAlign(TextAlign.Center)
                .width('100%')
            
            // 操作类型选择
            Column() {
                Text('操作类型')
                    .fontSize(14)
                    .fontColor('#666666')
                    .margin({ bottom: 10 })
                
                Select(this.operationOptions)
                    .value(this.operationType)
                    .onSelect((index: number, value?: string) => {
                        this.operationType = value || 'convert';
                    })
                    .width('100%')
                    .height(40)
            }
            .width('100%')
            .padding(15)
            .backgroundColor('#ffffff')
            .borderRadius(10)
            .border({ width: 1, color: '#eeeeee' })
            .margin({ bottom: 20 })
            
            // 体重单位选择
            Row() {
                Column() {
                    Text('源单位')
                        .fontSize(12)
                        .fontColor('#666666')
                        .margin({ bottom: 8 })
                    
                    Select(this.unitOptions)
                        .value(this.fromUnit)
                        .onSelect((index: number, value?: string) => {
                            this.fromUnit = value || 'kg';
                        })
                        .width('100%')
                        .height(40)
                }
                .width('48%')
                
                Text('→')
                    .fontSize(20)
                    .fontWeight(FontWeight.Bold)
                    .width('4%')
                    .textAlign(TextAlign.Center)
                
                Column() {
                    Text('目标单位')
                        .fontSize(12)
                        .fontColor('#666666')
                        .margin({ bottom: 8 })
                    
                    Select(this.unitOptions)
                        .value(this.toUnit)
                        .onSelect((index: number, value?: string) => {
                            this.toUnit = value || 'lb';
                        })
                        .width('100%')
                        .height(40)
                }
                .width('48%')
            }
            .width('100%')
            .padding(15)
            .backgroundColor('#ffffff')
            .borderRadius(10)
            .border({ width: 1, color: '#eeeeee' })
            .margin({ bottom: 20 })
            
            // 输入框
            Column() {
                Text('输入体重值')
                    .fontSize(14)
                    .fontColor('#666666')
                    .margin({ bottom: 10 })
                
                TextInput({ placeholder: '输入体重值' })
                    .value(this.inputValue)
                    .onChange((value: string) => {
                        this.inputValue = value;
                    })
                    .width('100%')
                    .height(45)
                    .padding({ left: 10, right: 10 })
                    .border({ width: 1, color: '#cccccc', radius: 8 })
                    .fontSize(14)
            }
            .width('100%')
            .padding(15)
            .backgroundColor('#ffffff')
            .borderRadius(10)
            .border({ width: 1, color: '#eeeeee' })
            .margin({ bottom: 20 })
            
            // 操作按钮
            Button('执行操作')
                .width('100%')
                .height(45)
                .fontSize(16)
                .fontWeight(FontWeight.Bold)
                .backgroundColor('#1B7837')
                .fontColor('#ffffff')
                .onClick(() => {
                    this.performOperation();
                })
                .margin({ bottom: 20 })
            
            // 结果显示
            if (this.showResult) {
                Column() {
                    Text('结果')
                        .fontSize(16)
                        .fontWeight(FontWeight.Bold)
                        .fontColor('#FFFFFF')
                        .width('100%')
                        .padding(12)
                        .backgroundColor('#1B7837')
                        .borderRadius(8)
                        .margin({ bottom: 12 })
                    
                    Scroll() {
                        Text(this.result)
                            .fontSize(14)
                            .fontColor('#333333')
                            .width('100%')
                            .padding(12)
                            .backgroundColor('#f9f9f9')
                            .borderRadius(6)
                            .textAlign(TextAlign.Start)
                            .selectable(true)
                    }
                    .width('100%')
                    .height(120)
                }
                .width('100%')
                .padding(15)
                .backgroundColor('#ffffff')
                .borderRadius(10)
                .border({ width: 1, color: '#eeeeee' })
            }
            
            Blank()
        }
        .width('100%')
        .height('100%')
        .padding(15)
        .backgroundColor('#f5f5f5')
        .scrollable(ScrollDirection.Vertical)
    }
}

ArkTS 代码说明: ArkTS 调用代码展示了如何在 OpenHarmony 应用中使用体重转换工具。页面包含操作类型选择、源单位和目标单位选择、输入框、操作按钮和结果显示等功能。通过 @State 装饰器管理状态,实现了完整的用户交互流程。用户可以选择操作类型和体重单位,输入体重值,然后点击执行按钮获得结果。


实战案例

案例1:健身应用

在健身应用中,需要根据用户所在地区显示不同的体重单位。

fun displayUserWeight(kilograms: Double, region: String): Map<String, String> {
    val converter = WeightConverter()
    
    return when (region) {
        "US" -> mapOf(
            "weight" to converter.formatWeight(converter.convertBetweenSystems(kilograms, "kg", "lb"), "lb"),
            "description" to converter.describeWeight(converter.convertMetric(kilograms, "kg", "g")),
            "emoji" to converter.getWeightEmoji(converter.convertMetric(kilograms, "kg", "g"))
        )
        "UK" -> mapOf(
            "weight" to converter.formatWeight(converter.convertBetweenSystems(kilograms, "kg", "st"), "st"),
            "description" to converter.describeWeight(converter.convertMetric(kilograms, "kg", "g")),
            "emoji" to converter.getWeightEmoji(converter.convertMetric(kilograms, "kg", "g"))
        )
        else -> mapOf(
            "weight" to converter.formatWeight(kilograms, "kg"),
            "description" to converter.describeWeight(converter.convertMetric(kilograms, "kg", "g")),
            "emoji" to converter.getWeightEmoji(converter.convertMetric(kilograms, "kg", "g"))
        )
    }
}

案例2:营养应用

在营养应用中,需要将食物重量从克转换为其他单位。

fun convertFoodWeight(grams: Double): Map<String, String> {
    val converter = WeightConverter()
    
    val kg = converter.convertMetric(grams, "g", "kg")
    val oz = converter.convertBetweenSystems(grams, "g", "oz")
    val lb = converter.convertBetweenSystems(grams, "g", "lb")
    
    return mapOf(
        "grams" to converter.formatWeight(grams, "g"),
        "kilograms" to converter.formatWeight(kg, "kg"),
        "ounces" to converter.formatWeight(oz, "oz"),
        "pounds" to converter.formatWeight(lb, "lb")
    )
}

案例3:医疗应用

在医疗应用中,需要记录和分析患者的体重变化。

fun analyzePatientWeight(weights: List<Double>, unit: String): Map<String, Any> {
    val converter = WeightConverter()
    
    val analysis = converter.analyzeWeights(weights, unit)
    
    return mapOf(
        "count" to analysis["count"],
        "maxWeight" to converter.formatWeight(analysis["max"] as Double, unit),
        "minWeight" to converter.formatWeight(analysis["min"] as Double, unit),
        "averageWeight" to converter.formatWeight((analysis["average"] as String).toDouble(), unit),
        "medianWeight" to converter.formatWeight(analysis["median"] as Double, unit)
    )
}

最佳实践

1. 体重验证

始终验证体重值是否为正数且在合理范围内。

2. 精度管理

根据应用需求选择合适的精度。医疗应用需要更高的精度。

3. 单位明确

始终明确显示体重单位,避免用户混淆。

4. 系统一致

在同一应用中保持体重单位的一致性。

5. 用户体验

提供体重描述和 emoji,提高用户体验。

6. 错误处理

提供清晰的错误消息,帮助用户理解问题。


总结

体重单位转换工具是现代应用开发中的重要组件。通过 KMP 框架,我们可以创建一个跨端的体重转换系统,在 Kotlin、JavaScript 和 ArkTS 中使用相同的转换逻辑。这不仅提高了代码的可维护性,还确保了不同平台上转换结果的一致性。

在实际应用中,合理使用体重转换工具可以提高应用的国际化程度和用户体验。无论是健身应用、营养管理还是医疗诊断,体重转换工具都能发挥重要作用。通过提供完整的体重转换功能和人性化的体重描述,我们可以帮助用户更好地理解和使用体重数据。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐