希望有人有个好主意。我有这样的字符串:
abcdefg
abcde
abc
我需要的是,如果超过指定的长度,他们就会被宣誓这样显示:
abc ..
abc ..
abc
我可以使用任何简单的C#代码吗?
答案 0 :(得分:117)
以下是扩展方法中包含的逻辑:
public static string Truncate(this string value, int maxChars)
{
return value.Length <= maxChars ? value : value.Substring(0, maxChars) + "...";
}
用法:
var s = "abcdefg";
Console.WriteLine(s.Truncate(3));
答案 1 :(得分:7)
public string TruncString(string myStr, int THRESHOLD)
{
if (myStr.Length > THRESHOLD)
return myStr.Substring(0, THRESHOLD) + "...";
return myStr;
}
忽略命名约定,以防他真正需要THRESHOLD变量或者它总是相同的大小。
可选地
string res = (myStr.Length > THRESHOLD) ? myStr.Substring(0, THRESHOLD) + ".." : myStr;
答案 2 :(得分:3)
.NET Framework中没有内置方法来执行此操作,但这是一种非常简单的自己编写方法。以下是步骤,尝试自己制作,让我们知道你想出了什么。
创建方法,可能是extension method public static void TruncateWithEllipsis(this string value, int maxLength)
检查传入的值是否大于使用Length
property指定的maxLength
。如果value
不大于maxLength
,则只返回value
。
如果我们没有按原样返回传入的值,那么我们知道我们需要截断。所以我们需要使用SubString
method获取字符串的较小部分。该方法将根据指定的开始和结束值返回字符串的较小部分。结束位置是maxLength
参数传递的内容,因此请使用它。
返回字符串的子部分加上省略号。
以后的一个很好的练习是更新方法,只有在完整的单词后才能中断。您还可以创建一个重载来指定您希望如何显示已被截断的字符串。例如,如果您的应用程序设置为通过单击显示更多详细信息,则该方法可以返回“(单击以获取更多)”而不是“...”。
答案 3 :(得分:3)
这是一个考虑省略号长度的版本:
theor_err = [ sqrt(abs(x)) for x in theor_df[str(INTENSITY)] ]
theor_err = np.asarray(theor_err)
for nr_sample in range(2):
sample = np.zeros(len(theor_df[str(INTENSITY)]))
for i, error in enumerate(theor_err):
sample[i] = theor_df[str(INTENSITY)][i] + random.uniform(-error, error)
theor_df['gen_{}'.format(nr_sample)] = Series(sample, index=theor_df.index)
theor_df.head()
答案 4 :(得分:3)
所有非常好的答案,但是要清理一点,不要在单词中间打断字符串。
private string TruncateForDisplay(this string value, int length)
{
if (string.IsNullOrEmpty(value)) return string.Empty;
var returnValue = value;
if (value.Length > length)
{
var tmp = value.Substring(0, length) ;
returnValue = tmp.Substring(0, tmp.LastIndexOf(' ') ) + " ...";
}
return returnValue;
}
答案 5 :(得分:2)
代码背后:
string shorten(sting s)
{
//string s = abcdefg;
int tooLongInt = 3;
if (s.Length > tooLongInt)
return s.Substring(0, tooLongInt) + "..";
return s;
}
标记:
<td><%= shorten(YOUR_STRING_HERE) %></td>
答案 6 :(得分:2)
为此目的实现方法可能更好:
string shorten(sting yourStr)
{
//Suppose you have a string yourStr, toView and a constant value
string toView;
const int maxView = 3;
if (yourStr.Length > maxView)
toView = yourStr.Substring(0, maxView) + " ..."; // all you have is to use Substring(int, int) .net method
else
toView = yourStr;
return toView;
}
答案 7 :(得分:1)
string s = "abcdefg";
if (s.length > 3)
{
s = s.substring(0,3);
}
您可以使用子串函数。
答案 8 :(得分:1)
我在搜索“C#truncate省略号”后发现了这个问题。使用各种答案,我创建了自己的解决方案,具有以下功能:
在尝试截断字符串之前,验证字符串是否为空或空。
public static class StringExtensions
{
public static string Truncate(this string value,
int maxLength,
bool addEllipsis = false)
{
// Check for valid string before attempting to truncate
if (string.IsNullOrEmpty(value)) return value;
// Proceed with truncating
var result = string.Empty;
if (value.Length > maxLength)
{
result = value.Substring(0, maxLength);
if (addEllipsis) result += "...";
}
else
{
result = value;
}
return result;
}
}
我希望这有助于其他人。
答案 9 :(得分:0)
当然,这里有一些示例代码:
string str = "abcdefg";
if (str.Length > X){
str = str.Substring(0, X) + "...";
}
答案 10 :(得分:0)
我最近有这个问题。我正在存储&#34;状态&#34; nvarcharMAX数据库字段中的消息,长度为4000个字符。但是我的状态消息正在建立并触发异常。
但它不是一个简单的截断情况,因为任意截断会孤立状态消息的一部分,所以我真的需要&#34;截断&#34;在字符串的一致部分。
我通过将字符串转换为字符串数组,删除第一个元素然后恢复为字符串来解决问题。这是代码(&#34; CurrentStatus&#34;是保存数据的字符串)...
if (CurrentStatus.Length >= 3750)
{
// perform some truncation to free up some space.
// Lets get the status messages into an array for processing...
// We use the period as the delimiter, then skip the first item and re-insert into an array.
string[] statusArray = CurrentStatus.Split(new string[] { "." }, StringSplitOptions.None)
.Skip(1).ToArray();
// Next we return the data to a string and replace any escaped returns with proper one.
CurrentStatus = (string.Join(".", statusArray))
.Replace("\\r\\n", Environment.NewLine);
}
希望能帮助别人。