Dart:如何截断字符串并在字符编号后添加省略号

bxfogqkk  于 2022-12-20  发布在  其他
关注(0)|答案(8)|浏览(163)

我想添加省略号到字符串后的某个字符长度,如果字符串长度是不符合字符预设字符长度,省略号(...)不应该添加。
我如何在 dart 语言中实现这一点?

omqzjyyz

omqzjyyz1#

创建扩展名.dart文件。

String truncateString(String data, int length) {
  return (data.length >= length) ? '${data.substring(0, length)}...' : data;
}

将此用作自定义扩展名。
用途

import 'package:project/util/extensions.dart';

truncateString('Sam Trio', 5)
dohp0rv5

dohp0rv52#

以下方法基于前面的答案,具有以下优点:

  • 在String上使用扩展名
  • 即使要截断的字符串短于限制也有效(无范围错误)
  • 使用单字符默认省略号(* 即 *“...”)
  • 在确定要截断的长度时考虑省略号,确保省略号不会使字符串最终超过最大长度。
extension StringExtension on String {
  /// Truncate a string if it's longer than [maxLength] and add an [ellipsis].
  String truncate(int maxLength, [String ellipsis = "…"]) => length > maxLength
      ? '${substring(0, maxLength - ellipsis.length)}$ellipsis'
      : this;
}
efzxgjgh

efzxgjgh3#

再举一个例子,不要剪字。

/// truncate the [String] without cutting words. The length is calculated with the suffix.
extension Truncate on String {
  String truncate({required int max, String suffix = ''}) {
    return length < max
        ? this
        : '${substring(0, substring(0, max - suffix.length).lastIndexOf(" "))}$suffix';
  }
}

如何使用的示例

print('hello world two times!'.truncate(max: 15, suffix: '...'));

结果是hello world...

uqzxnwby

uqzxnwby4#

所有建议的解决方案的问题是,他们截断字符串以适应字符串的给定大小。但是当我们真正得到字符串太长的问题时?是的,当外部组件对于我们的字符串太小时就会发生这种情况。所有建议的解决方案都会切断字符串,即使有足够的空间容纳它,例如,关于wingow size changing on desktop.几年前我在java中根据显示字符串的组件的大小解决了这个问题,但是我还没有在Flutter中找到解决方案。
我发现:-)

String truncate(String text, TextStyle style, double parentComponentLength) {
    String postfix = '...';
    var size = _calcTextSize(text, style);
    if (size.width < parentComponentLength) {
      return text;
    }
    while (size.width > parentComponentLength) {
      text = text.substring(0, text.length - 1);
      size = _calcTextSize('$text$postfix', style);
    }
    return '$text$postfix';
  }

  Size _calcTextSize(String text, TextStyle style) {
    final TextPainter textPainter = TextPainter(
      text: TextSpan(text: text, style: style),
      textDirection: TextDirection.ltr,
      textScaleFactor: WidgetsBinding.instance.window.textScaleFactor,
    )..layout();
    return textPainter.size;
}
u4dcyp6a

u4dcyp6a5#

你可以这样做:

String truncateWithEllipsis(int cutoff, String myString) {
  return (myString.length <= cutoff)
    ? myString
    : '${myString.substring(0, cutoff)}...';
}
6mw9ycah

6mw9ycah6#

您可以使用replaceRange方法进行此操作。
replaceRange

var text = 'Hello World!';
  var r = text.replaceRange(7, text.length, '...');
  print(r); // -> Hello W...

下面是一个完整的示例:

String truncate(String text, { length: 7, omission: '...' }) {
  if (length >= text.length) {
    return text;
  }
  return text.replaceRange(length, text.length, omission);
}

void main() {
  print(truncate('Hello, World!', length: 4));
}
laawzig2

laawzig27#

使用如下所示的容器 Package 文本小部件
请:阅读下面代码中的注解行

class TruncatedText extends StatelessWidget {
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(),

    body: Container(
      //Here you can control the width of your container ..
      //when text exceeds it will be trancated via elipses...
      width: 130.0,
      child: Text('I have a trancated text',
        style: TextStyle(fontSize: 20),

        softWrap: false,
        overflow: TextOverflow.ellipsis,
      ),
    ),
  );
}  
}

编辑:
你可以使用这个纯粹的dart代码作为Flutter的原始解决方案

void main() {
  String to_be_truncated = "Dart is excellent but flutter is awesome";
  int truncateAt = to_be_truncated.length-1;//if you use to_be_truncated.lengh no truncation will happen
  String elepsis = "..."; //define your variable truncation elipsis here 
  String truncated ="";
  
  if(to_be_truncated.length > truncateAt){
     truncated = to_be_truncated.substring(0,truncateAt-elepsis.length)+elepsis; 
  }else{
    truncated = to_be_truncated;
  } 
   print(truncated);
}
c8ib6hqw

c8ib6hqw8#

可以对字符串使用Extension:

extension StringExtension on String {
  String truncateTo(int maxLength) =>
      (this.length <= maxLength) ? this : '${this.substring(0, maxLength)}...';
}

然后

'My Very Long Text'.truncateTo(7); // My Very...

相关问题