HarmonyOS NEXT Development Case: Character Count Statistics

The following code demonstrates how to create a character counting component in HarmonyOS NEXT that can handle mixed Chinese and English text input while implementing specific counting rules. // Define a component for number and text statistics @Entry @Component struct NumberToChineseConverter { // State variable storing example number string @State private exampleNumber: string = '自从盘古破鸿蒙,开辟从兹清浊辨。\nare you ok?\n1234\n+-*/'; // Text color state variable @State private textColor: string = "#2e2e2e"; // Shadow border color state variable @State private shadowColor: string = "#d5d5d5"; // Base padding state variable @State private basePadding: number = 30; // Chinese character count state variable @State private chineseCharCount: string = "0"; // Chinese punctuation count state variable @State private chinesePunctuationCount: string = "0"; // Total Chinese characters + punctuation state variable @State private totalChineseCount: string = "0"; // English character count state variable @State private englishCharCount: string = "0"; // Digit count state variable @State private digitCount: string = "0"; // Total character count state variable @State private charTotalCount: string = "0"; // Input text state variable with change listener @State @Watch('inputChanged') private inputText: string = ""; // Method called when input text changes inputChanged() { // Initialize counters let chineseChars = 0; // Chinese characters let chinesePunctuation = 0; // Chinese punctuation let englishChars = 0; // English characters let digits = 0; // Digits let count = 0; // Total characters // Iterate through each character for (let i = 0; i { this.inputText = this.exampleNumber; }); Blank(); Text('Clear') .fontColor("#e48742") .fontSize(16) .padding(`${this.basePadding / 2}lpx`) .clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 }) .backgroundColor("#ffefe6") .borderRadius(5) .onClick(() => { this.inputText = ""; }); } .height(45) .justifyContent(FlexAlign.SpaceBetween) .width('100%'); Divider(); TextArea({ text: $$this.inputText, placeholder: `Input text here` }) .width(`${650 - this.basePadding * 2}lpx`) .height(100) .fontSize(16) .caretColor(this.textColor) .fontColor(this.textColor) .margin({ top: `${this.basePadding}lpx` }) .padding(0) .backgroundColor(Color.Transparent); } .alignItems(HorizontalAlign.Start) .width('650lpx') .padding(`${this.basePadding}lpx`) .margin({ top: `${this.basePadding}lpx` }) .borderRadius(10) .backgroundColor(Color.White) .shadow({ radius: 10, color: this.shadowColor }); // Statistics display section Column() { // Multiple Rows showing different counts... // (Similar structure to Chinese version with English translations) } .alignItems(HorizontalAlign.Start) .width('650lpx') .padding(`${this.basePadding}lpx`) .margin({ top: `${this.basePadding}lpx` }) .borderRadius(10) .backgroundColor(Color.White) .shadow({ radius: 10, color: this.shadowColor }); } } .scrollBar(BarState.Off) .clip(false); } .height('100%') .width('100%') .backgroundColor("#f4f8fb"); } } Key Features Character Counting Rules Chinese characters and punctuation count as 2 units Digits, English characters, and symbols count as 1 unit Real-time updates through @Watch decorator UI Components Clean material design with shadow effects Scrollable container for responsive layout Example/Clear buttons with click effects Thematic color scheme management Technical Highlights Regular expressions for character classification State management with @State decorators Responsive layout using lpx units Component-based architecture This implementation demonstrates HarmonyOS NEXT's capabilities in building responsive, feature-rich applications with clean state management and modern UI components.

May 11, 2025 - 04:46
 0
HarmonyOS NEXT Development Case: Character Count Statistics

Image description
The following code demonstrates how to create a character counting component in HarmonyOS NEXT that can handle mixed Chinese and English text input while implementing specific counting rules.

// Define a component for number and text statistics
@Entry
@Component
struct NumberToChineseConverter {
  // State variable storing example number string
  @State private exampleNumber: string = '自从盘古破鸿蒙,开辟从兹清浊辨。\nare you ok?\n1234\n+-*/';
  // Text color state variable
  @State private textColor: string = "#2e2e2e";
  // Shadow border color state variable
  @State private shadowColor: string = "#d5d5d5";
  // Base padding state variable
  @State private basePadding: number = 30;
  // Chinese character count state variable
  @State private chineseCharCount: string = "0";
  // Chinese punctuation count state variable
  @State private chinesePunctuationCount: string = "0";
  // Total Chinese characters + punctuation state variable
  @State private totalChineseCount: string = "0";
  // English character count state variable
  @State private englishCharCount: string = "0";
  // Digit count state variable
  @State private digitCount: string = "0";
  // Total character count state variable
  @State private charTotalCount: string = "0";
  // Input text state variable with change listener
  @State @Watch('inputChanged') private inputText: string = "";

  // Method called when input text changes
  inputChanged() {
    // Initialize counters
    let chineseChars = 0;      // Chinese characters
    let chinesePunctuation = 0; // Chinese punctuation
    let englishChars = 0;      // English characters
    let digits = 0;            // Digits
    let count = 0;             // Total characters

    // Iterate through each character
    for (let i = 0; i < this.inputText.length; i++) {
      let char = this.inputText.charAt(i);
      count++;

      if (/\d/.test(char)) {
        digits++;
      }
      if (/[\u4e00-\u9fa5]/.test(char)) {
        chineseChars++;
        count++;  // Chinese characters count as 2 units
      }
      if (/[\u3001-\u3002\uff01-\uff1a]/.test(char)) {
        chinesePunctuation++;
        count++;  // Chinese punctuation counts as 2 units
      }
      if (/[a-zA-Z0-9\s!-/:-@[-`{-~]/.test(char)) {
        englishChars++;
      }
    }

    // Update state variables
    this.chineseCharCount = `${chineseChars}`;
    this.chinesePunctuationCount = `${chinesePunctuation}`;
    this.totalChineseCount = `${chineseChars + chinesePunctuation}`;
    this.englishCharCount = `${englishChars}`;
    this.digitCount = `${digits}`;
    this.charTotalCount = `${count}`;
  }

  // UI construction method
  build() {
    Column() {
      Text('Character Counter')
        .fontColor(this.textColor)
        .fontSize(18)
        .width('100%')
        .height(50)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.White)
        .shadow({
          radius: 2,
          color: this.shadowColor,
          offsetX: 0,
          offsetY: 5
        });

      Scroll() {
        Column() {
          // Tool introduction section
          Column() {
            Text('Tool Description').fontSize(18).fontWeight(600).fontColor(this.textColor);
            Text('This tool quickly counts characters in input text, including Chinese characters, punctuation, digits, and English characters. Rules:\n• Chinese characters and punctuation count as 2 units\n• Digits, spaces, and English characters count as 1 unit')
              .textAlign(TextAlign.JUSTIFY)
              .fontSize(13)
              .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.shadowColor });

          // Example and Clear section
          Column() {
            Row() {
              Text('Example')
                .fontColor("#5871ce")
                .fontSize(16)
                .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(16)
                .padding(`${this.basePadding / 2}lpx`)
                .clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 })
                .backgroundColor("#ffefe6")
                .borderRadius(5)
                .onClick(() => {
                  this.inputText = "";
                });
            }
            .height(45)
            .justifyContent(FlexAlign.SpaceBetween)
            .width('100%');

            Divider();
            TextArea({ text: $$this.inputText, placeholder: `Input text here` })
              .width(`${650 - this.basePadding * 2}lpx`)
              .height(100)
              .fontSize(16)
              .caretColor(this.textColor)
              .fontColor(this.textColor)
              .margin({ top: `${this.basePadding}lpx` })
              .padding(0)
              .backgroundColor(Color.Transparent);
          }
          .alignItems(HorizontalAlign.Start)
          .width('650lpx')
          .padding(`${this.basePadding}lpx`)
          .margin({ top: `${this.basePadding}lpx` })
          .borderRadius(10)
          .backgroundColor(Color.White)
          .shadow({ radius: 10, color: this.shadowColor });

          // Statistics display section
          Column() {
            // Multiple Rows showing different counts...
            // (Similar structure to Chinese version with English translations)
          }
          .alignItems(HorizontalAlign.Start)
          .width('650lpx')
          .padding(`${this.basePadding}lpx`)
          .margin({ top: `${this.basePadding}lpx` })
          .borderRadius(10)
          .backgroundColor(Color.White)
          .shadow({ radius: 10, color: this.shadowColor });
        }
      }
      .scrollBar(BarState.Off)
      .clip(false);
    }
    .height('100%')
    .width('100%')
    .backgroundColor("#f4f8fb");
  }
}

Key Features

  1. Character Counting Rules

    • Chinese characters and punctuation count as 2 units
    • Digits, English characters, and symbols count as 1 unit
    • Real-time updates through @Watch decorator
  2. UI Components

    • Clean material design with shadow effects
    • Scrollable container for responsive layout
    • Example/Clear buttons with click effects
    • Thematic color scheme management
  3. Technical Highlights

    • Regular expressions for character classification
    • State management with @State decorators
    • Responsive layout using lpx units
    • Component-based architecture

This implementation demonstrates HarmonyOS NEXT's capabilities in building responsive, feature-rich applications with clean state management and modern UI components.