在编程过程中,字符串操作是必不可少的一部分。仓颉编程语言提供了丰富的字符串工具函数,使得字符串处理变得更加方便和高效。本文将详细介绍仓颉语言中的字符串操作功能,并介绍一些常用的类型转换方法。

一、字符串操作

字符串类型是一个非常常用的数据类型。以下将详细介绍仓颉语言中字符串的各种工具函数。

  1. 将字符串转为字符数组(toRuneArray())

toRuneArray()方法将字符串转换为字符数组,每个字符被单独存储为一个rune类型。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.toRuneArray())
    return 0
}
  1. 将字符串转为字节数组(toArray())

toArray()方法将字符串转换为字节数组,每个字符被转换为其对应的字节表示。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.toArray())
    return 0
}
  1. 获取字符串的字节长度

size属性返回字符串的字节长度。注意:英文字母占1个字节,中文汉字占3个字节(UTF-8编码下)。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.size)
    return 0
}
  1. 获取字符串字面长度

使用toRuneArray()方法将字符串转换为字符数组,然后获取该数组的长度,可以得到字符串的实际字符数。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.toRuneArray().size)
    return 0
}
  1. 判断字符串中是否包含指定字符串(contains())

contains()方法用于判断字符串中是否包含指定的子字符串。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.contains("钝"))
    return 0
}
  1. 统计指定字符串在指定字符串中出现的次数(count())

count()方法用于统计指定字符串在字符串中出现的次数。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.count("l"))
    return 0
}
  1. 判断字符串是否以指定字符串开头或者结尾(startsWith()、endsWith())

startsWith()endsWith()方法用于判断字符串是否以指定的子字符串开头或结尾。注意:区分英文字母的大小写。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.startsWith("Hello"))  // 区分大小写
    println(str.startsWith("生"))     // 区分大小写
    println(str.endsWith("钝子生"))   // 区分大小写
    println(str.endsWith("子"))      // 区分大小写
    return 0
}
  1. 获取指定字符串的索引(indexOf()、lastIndexOf())

indexOf()lastIndexOf()方法用于获取指定子字符串在字符串中的索引位置。indexOf()从字符串开头开始查找,lastIndexOf()从字符串末尾开始查找。还可以指定起始位置进行查找。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.indexOf("o"))        // 输出3
    println(str.lastIndexOf("l"))    // 输出9
    println(str.indexOf("l", 2))     // 从索引2开始查找,输出3
    return 0
}
  1. 去除字符串的前缀或后缀(trimStart()、trimEnd())

trimStart()trimEnd()方法用于去除字符串的前缀或后缀。注意:去除后的字符串是新的字符串。

package Study
import std.unicode.*

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.trimStart("He"))   // 输出"llo,我叫钝子生"
    println(str.trimEnd("生"))     // 输出"Hello,我叫钝子"
    return 0
}
  1. 替换字符串(replace())

replace()方法用于替换字符串中的指定子字符串。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.replace("Hello", "Hi"))  // 输出"Hi,我叫钝子生"
    return 0
}
  1. 字符串的分割和连接(split()、join())

split()方法用于将字符串按照指定的分隔符分割成字符数组,String.join()方法用于将字符数组连接成字符串。

package Study

main(): Int64 {
    var str = "Hello|,|我叫钝子生"
    println(str.split("|"))  // 输出["Hello", ",", "我叫钝子生"]
    println(String.join(str.split("|"), delimiter: ""))  // 输出"Hello,我叫钝子生"
    return 0
}
  1. 大小写转换(toAsciiLower()、toAsciiUpper()、toAsciiTitle())

toAsciiLower()toAsciiUpper()toAsciiTitle()方法分别用于将字符串转换为小写、大写和标题格式(即每个单词的首字母大写)。

package Study

main(): Int64 {
    var str = "Hello,我叫钝子生"
    println(str.toAsciiLower())  // 输出"hello,我叫钝子生"
    println(str.toAsciiUpper())  // 输出"HELLO,我叫钝子生"
    println(str.toAsciiTitle())  // 输出"Hello,我叫钝子生"
    return 0
}
  1. 类型转换(toString()、parse()需要导包)

toString()方法用于将其他类型转换为字符串,parse()方法用于将字符串转换为特定类型。这些方法需要导入std.convert.Parsable包。

package Study
import std.convert.Parsable

main(): Int64 {
    let num = 123
    let float = 123.456

    let newNum = num.toString()
    let newFloat = float.toString()
    println(newNum)  // 输出"123"
    println(newFloat)  // 输出"123.456"

    let str = "true"
    let flag = Bool.tryParse(str)
    println(flag)  // 输出true

    let intStr = "456"
    let intNum = Int64.tryParse(intStr)
    println(intNum)  // 输出Option(456)

    return 0
}
  1. 字符串的拼接和构建(StringBuilder类)

StringBuilder类用于高效地构建和拼接字符串。相比于直接使用String进行拼接,StringBuilder的效率更高。

package Study

main(): Int64 {
    let stringBuilder = StringBuilder()
    stringBuilder.append("H")
    stringBuilder.append("ello,")
    stringBuilder.append("我叫")
    stringBuilder.append("钝子生")
    println(stringBuilder)  // 输出"Heello,我叫钝子生"
    return 0
}

注意:StringBuilder类对字符串的拼接效率远高于String

二、类型转换

类型转换在编程中也是非常常见的需求。仓颉语言提供了多种类型转换的方法,确保类型转换的安全性和灵活性。

  1. 整数到字符串(toString())
package Study

main(): Int64 {
    let num = 123
    println(num.toString())  // 输出"123"
    return 0
}
  1. 浮点数到字符串(toString())
package Study

main(): Int64 {
    let float = 123.456
    println(float.toString())  // 输出"123.456"
    return 0
}
  1. 字符串到布尔值(tryParse())
package Study
import std.convert.Parsable

main(): Int64 {
    let str = "true"
    let flag = Bool.tryParse(str)
    println(flag)  // 输出true
    return 0
}
  1. 字符串到整数(tryParse())
package Study
import std.convert.Parsable

main(): Int64 {
    let intStr = "456"
    let intNum = Int64.tryParse(intStr)
    println(intNum)  // 输出Option(456)
    return 0
}
  1. 字符串到浮点数(tryParse())
package Study
import std.convert.Parsable

main(): Int64 {
    let floatStr = "123.456"
    let floatNum = Float64.tryParse(floatStr)
    println(floatNum)  // 输出Option(123.456)
    return 0
}
总结

本文详细介绍了仓颉编程语言中的字符串操作和类型转换功能。通过这些工具函数,仓颉语言使得字符串处理更加灵活和高效。以下是本文介绍的主要内容:

  1. 字符串操作

    • toRuneArray():将字符串转换为字符数组。
    • toArray():将字符串转换为字节数组。
    • size:获取字符串的字节长度。
    • toRuneArray().size:获取字符串的字面长度。
    • contains():判断字符串中是否包含指定子字符串。
    • count():统计指定子字符串在字符串中出现的次数。
    • startsWith()endsWith():判断字符串是否以指定子字符串开头或结尾。
    • indexOf()lastIndexOf():获取指定子字符串的索引位置。
    • trimStart()trimEnd():去除字符串的前缀或后缀。
    • replace():替换字符串中的指定子字符串。
    • split()String.join():字符串的分割和连接。
    • toAsciiLower()toAsciiUpper()toAsciiTitle():字符串的大写和小写转换。
    • toString():将其他类型转换为字符串。
    • parse():将字符串转换为特定类型。
  2. 类型转换

    • toString():将整数和浮点数转换为字符串。
    • tryParse():将字符串转换为布尔值、整数和浮点数。

通过这些功能,仓颉编程语言不仅保持了强类型系统的严谨性,还提供了丰富的字符串处理和类型转换工具,使得编程更加方便和高效。希望本文能帮助读者更好地理解和使用仓颉编程语言中的字符串操作和类型转换功能。

除了一些基础类型转换,仓颉语言中的类型转换仓颉语言中还存在其他重要的类型转换方式和模式。以下是对仓颉编程语言中的类型转换的介绍。

一、输入流读取与类型转换

1. 标准输入读取与默认值处理

// 读取输入行,如果为None则使用默认值"0"
var strw = getStdIn().readln() ?? "0"

// 将字符串转换为Float64,如果转换失败则抛出异常
w = Float64.tryParse(strw).getOrThrow()

2. 安全解析数字输入

// 更安全的处理方式(提供默认值)
let input = getStdIn().readln() ?? "0"
let number = Float64.tryParse(input).getOrElse(0.0)

二、Option类型的链式转换

1. 安全转换链

// 从可能为空的输入到最终数值的安全转换链
let result = getStdIn().readln()
    .flatMap(str => Int64.tryParse(str))
    .getOrElse(0)

2. 使用map转换Option内部值

let maybeNum: ?String = Some("123")
let squared = maybeNum
    .flatMap(s => Int64.tryParse(s))
    .map(n => n * n)

三、集合类型转换

1. 数组元素类型转换

let strArray = ["1", "2", "3"]
let intArray = strArray.map(s => s.toInt64().getOrThrow())

2. 安全过滤转换

let mixedArray: Array<Any> = [1, "2", 3.0, "text"]
let numbers = mixedArray.filterMap {
    match (it) {
        case i is Int64 => Some(i)
        case s is String => s.toInt64()
        case _ => None
    }
}

四、类型转换辅助方法

1. 带进制支持的转换

let hexStr = "FF"
let num = Int64.tryParse(hexStr, radix: 16).getOrElse(0)

2. 边界检查转换

// 安全转换为Int8(检查溢出)
let bigNum: Int64 = 300
let smallNum = bigNum.tryToInt8().getOrElse {
    println("值超出Int8范围")
    Int8.MAX_VALUE
}

五、自定义类型转换扩展

1. 为自定义类添加转换方法

class Temperature {
    var celsius: Float64
    
    public func toFahrenheit(): Float64 {
        return celsius * 9/5 + 32
    }
}

// 使用示例
let temp = Temperature(celsius: 25.0)
let fahrenheit = temp.toFahrenheit()

2. 实现From/Into模式

interface Into<T> {
    func into(): T
}

impl Into<String> for Int64 {
    func into(): String {
        this.toString()
    }
}

// 使用示例
let num: Int64 = 42
let str: String = num.into()

六、类型转换错误处理最佳实践

1. 提供详细的错误信息

let userInput = "123a"
let num = Int64.tryParse(userInput).getOrElseWith {
    println("输入'${userInput}'不是有效数字")
    return 0
}

2. 使用Result类型处理复杂转换

func parseUserInput(input: String): Result<Float64, String> {
    match (Float64.tryParse(input)) {
        case Some(n) => Ok(n)
        case None => Err("输入'${input}'不是有效浮点数")
    }
}

七、性能敏感场景的转换优化

1. 避免不必要的中间转换

// 不佳的方式(创建中间String)
let num = 123
let str = num.toString()
let backToNum = str.toInt64()

// 更好的方式(直接使用原值)
let finalNum = num.toFloat64()

2. 使用值类型转换(VArray)

let varray: VArray<Int64, $3> = [1, 2, 3]
let floatVArray = varray.map(x => x.toFloat64())

仓颉语言的类型转换系统既强调安全性(通过Option和显式转换),又提供了丰富的转换组合方式。在实际开发中,建议:

  1. 优先使用tryParse而非parse避免异常
  2. 合理使用??getOrElse提供默认值
  3. 对复杂转换流程使用flatMap/filterMap组合
  4. 为自定义类型实现清晰的转换接口
  5. 在性能关键路径避免不必要的中间转换

这些补充内容与原有知识共同构成了仓颉语言完整的类型转换体系。

参考链接

https://cangjie-lang.cn/docs?url=%2F1.0.0%2Flibs%2Fstd%2Fcore%2Fcore_package_api%2Fcore_package_enums.html%23enum-optiont

https://cangjie-lang.cn/docs?url=%2F1.0.1%2Flibs%2Fstd%2Fenv%2Fenv_package_api%2Fenv_package_classes.html%23class-consolereader

https://cangjie-lang.cn/docs?url=%2F1.0.0%2Flibs%2Fstd%2Fcore%2Fcore_package_api%2Fcore_package_enums.html%23enum-optiont

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐