DEV Community

Cover image for HarmonyOS NEXT Development Case: Converting Numbers to Chinese Numerals
zhongcx
zhongcx

Posted on

HarmonyOS NEXT Development Case: Converting Numbers to Chinese Numerals

Image description

// Import necessary modules
import { promptAction } from '@kit.ArkUI'; // For displaying toast messages
import { pasteboard } from '@kit.BasicServicesKit'; // Clipboard operations
import { toChineseNumber } from '@nutpi/chinese-finance-number'; // Convert numbers to Chinese financial uppercase
import {
  toChineseWithUnits, // Convert numbers to Chinese with units
  toUpperCase, // Convert Chinese lowercase to uppercase
} from '@nutpi/chinese-number-format';

@Entry // Mark as entry component
@Component // Define component
struct NumberToChineseConverter {
  @State private exampleNumber: number = 88.8; // Default example number
  @State private textColor: string = "#2e2e2e"; // Primary text color
  @State private lineColor: string = "#d5d5d5"; // Divider color
  @State private basePadding: number = 30; // Base padding value
  @State private chineseLowercase: string = ""; // Lowercase Chinese result
  @State private chineseUppercase: string = ""; // Uppercase Chinese result
  @State private chineseUppercaseAmount: string = ""; // Financial uppercase result
  @State @Watch('inputChanged') private inputText: string = ""; // Watched input field

  // Handle input changes
  inputChanged() {
    this.chineseLowercase = toChineseWithUnits(Number(this.inputText), 'zh-CN');
    this.chineseUppercase = toUpperCase(this.chineseLowercase, 'zh-CN');
    this.chineseUppercaseAmount = toChineseNumber(Number(this.inputText));
  }

  // Copy text to clipboard
  private copyToClipboard(text: string): void {
    const pasteboardData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text);
    const systemPasteboard = pasteboard.getSystemPasteboard();
    systemPasteboard.setData(pasteboardData);
    promptAction.showToast({ message: 'Copied' });
  }

  // UI construction
  build() {
    Column() {
      // Header section
      Text('Number to Chinese Converter')
        .fontColor(this.textColor)
        .fontSize(18)
        .width('100%')
        .height(50)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.White)
        .shadow({
          radius: 2,
          color: this.lineColor,
          offsetX: 0,
          offsetY: 5
        });

      Scroll() {
        Column() {
          // Introduction section
          Column() {
            Text('Tool Introduction').fontSize(20).fontWeight(600).fontColor(this.textColor);
            Text('Convert numbers to Chinese formats for financial documents, contracts, and reports. Supports conversion from "cent" to "trillion".')
              .textAlign(TextAlign.JUSTIFY)
              .fontSize(18).fontColor(this.textColor).margin({ top: `${this.basePadding / 2}lpx` });
          }
          .alignItems(HorizontalAlign.Start)
          .width('650lpx')
          .padding(`${this.basePadding}lpx`)
          .margin({ top: `${this.basePadding}lpx` })
          .borderRadius(10)
          .backgroundColor(Color.White)
          .shadow({ radius: 10, color: this.lineColor });

          // Input section
          Column() {
            Row() {
              Text('Example')
                .fontColor("#5871ce")
                .fontSize(18)
                .padding(`${this.basePadding / 2}lpx`)
                .backgroundColor("#f2f1fd")
                .borderRadius(5)
                .clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 })
                .onClick(() => { this.inputText = `${this.exampleNumber}`; });
              Blank();
              Text('Clear')
                .fontColor("#e48742")
                .fontSize(18)
                .padding(`${this.basePadding / 2}lpx`)
                .clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 })
                .backgroundColor("#ffefe6")
                .borderRadius(5)
                .onClick(() => { this.inputText = ""; });
            }.height(45).justifyContent(FlexAlign.SpaceBetween);
            Divider().margin({ top: 5, bottom: 5 });
            TextInput({ text: $$this.inputText, placeholder: `Enter number, e.g.: ${this.exampleNumber}` })
              .width('100%')
              .fontSize(18)
              .caretColor(this.textColor)
              .margin({ top: `${this.basePadding}lpx` })
              .type(InputType.NUMBER_DECIMAL);
          }
          .width('650lpx')
          .padding(`${this.basePadding}lpx`)
          .margin({ top: `${this.basePadding}lpx` })
          .backgroundColor(Color.White)
          .shadow({ radius: 10, color: this.lineColor });

          // Result section
          Column() {
            // ... (similar structure for result rows with copy buttons)
          }
          .width('650lpx')
          .padding(`${this.basePadding}lpx`)
          .margin({ top: `${this.basePadding}lpx` })
          .backgroundColor(Color.White)
          .shadow({ radius: 10, color: this.lineColor });
        }
      }.scrollBar(BarState.Off);
    }
    .height('100%')
    .width('100%')
    .backgroundColor("#f4f8fb");
  }
}
Enter fullscreen mode Exit fullscreen mode

Technical Implementation Overview

1. Core Conversion Logic

  • toChineseWithUnits: Converts numbers to colloquial Chinese with units (e.g., 88.8 → 八十八点八)
  • toUpperCase: Transforms lowercase Chinese numbers to formal uppercase (e.g., 八 → 捌)
  • toChineseNumber: Specialized financial conversion following official accounting standards

2. State Management

  • @State decorators manage UI-reactive variables
  • @Watch observes input changes to trigger conversions
  • Three conversion results maintain independent states for optimal rendering

3. UI Features

  • Responsive Layout: Adaptive design for multiple screen sizes
  • Visual Feedback:
    • Click effects with scaling animation
    • Toast notifications for copy operations
    • Shadow effects for depth perception
  • Input Validation:
    • Restricted to decimal numbers
    • Automatic conversion handling

4. Clipboard Integration

  • System pasteboard API usage
  • MIME type handling for text data
  • Error-safe data packaging

Usage Scenarios

  1. Financial document preparation
  2. Legal contract writing
  3. Invoice processing systems
  4. Educational tools for Chinese numerals
  5. Cross-cultural business applications

This implementation demonstrates HarmonyOS NEXT's capabilities in handling:

  • Reactive UI development
  • Native service integration
  • Complex number formatting
  • Cross-cultural localization requirements

Developers can extend this pattern to implement other regional number formatting requirements while maintaining the core architecture.

Top comments (0)