【发布时间】:2015-03-03 05:21:35
【问题描述】:
我有一个包含字符串的数组,我想知道如何获取一个字符串并在指定的像素长度处切下一部分并将其添加到数组中。
例如,
string[] string1 = { "Hello World" };
我正在使用 XNA,所以我可以通过使用来获取像素长度,
FontName.MeasureString(string1[0]).Length()
例如,如果上面的代码返回 100 像素长,我如何将字符串剪切为 70 像素长并将其添加回数组以获得此:
string1 = { "Hello Wo", "rld" } // Hello Wo(100px), rld(30px)
我已经研究过使用 StringBuilder,但它以字符长度测量字符串。如果没有可能的方法来实现这一点,是否有一种方法可以找出字符串的开头和我希望字符串在哪里截断的像素点之间有多少个字符,那么我会能够使用 StringBuilder。
编辑:
所以我尝试循环遍历数组,然后循环遍历数组中的每个字符并将其添加到列表中,它有点工作,但在将它添加回数组后我无法让它继续。
string[] stringArray = { "Hello World" };
List<Char> charList = new List<Char>();
List<Char> charList2 = new List<Char>();
List<String> stringList = new List<String>();
for (int i = 0; i < stringArray.Length; i++)
{
if ((int)consolas.MeasureString(stringArray[i]).Length() > 30)
{
for (int c = 0; c < stringArray[i].Length; c++)
{
if (consolas.MeasureString(string.Join("", charList)).Length() < 30)
{
charList.Add(stringArray[i][c]);
}
else
{
charList2.Add(stringArray[i][c]);
}
}
}
}
stringList.Add(string.Join("", charList));
stringList.Add(string.Join("", charList2));
stringArray = stringList.ToArray();
charList.Clear();
charList2.Clear();
stringList.Clear();
上面的代码返回给我
stringArray = { "He", "llo World" };
这是我想要的,但我希望它继续这样做
stringArray = { "He", "ll", "o World" };
当字符串超过 30px 时继续拆分字符串。我已经考虑过了,我似乎不明白为什么它没有进一步分裂。
【问题讨论】:
-
设置一个循环...为数组的下一部分保留一个字符串,并向其中添加字符,直到测量字符串产生您想要的像素长度,然后将该字符串的副本添加到数组的末端,并清除它以冲洗并重复。
-
我没有使用过 XNA。我(可能很天真)的做法是进行二进制搜索 - 取一半字符串并检查其像素长度 - 如果太长,则取前半部分的一半并检查;如果太短,就拿下半场的一半来检查一下。
-
你的第一个需要是字符串数组吗?你是否曾经要处理例如? string[] stringArray = { "Hello World", "More Hello World" };