我正在使用一个小函数,该函数应该在子字符串中断开字符串,以确保不会剪切任何单词。
让我们得到这个用例:
"出了点问题,我搞不清出什么问题"
总字符数: 63;
每行的最大字符长度为 15 个字符,我会得到这个 substr"某事正在走"
如您所见,当我想获得整个单词时,它正在削减单词。
行[1]:某些东西是//在最大字符长度下方的最后一个空格上断开字符串;
行[2]:出错...//包括第二行开头第一行中缺少的字符
行[3]: ...//依此类推,直到所有字符都循环播放。
我想出了这个让我发疯的解决方案。
function splitString(obj:Object):Array{
if (obj.hasOwnProperty("d_string"))
{
var texto:String = obj.d_string;
var textoStr:Array = texto.split("");
var textoLen:Number = texto.length;
trace("textoLen " + textoLen);
var maxCharPerLine:Number;
if (obj.hasOwnProperty("d_limit")){
maxCharPerLine = obj.d_limit;
trace("maxCharPerLine" + maxCharPerLine);
}else{
maxCharPerLine = 20;
}
var textLine:Array = [];
var currentLine:Number = 1;
var currentIndex:Number = 0;
var cachedCharsForLine:Array = []; //all characters between the range
var lastCachedCharsForLine:Array = []; //mirror of all characters stoping at the last space found
var missingChars:Array = [];
var canCleanData:Boolean = false;
/*START LOOPING OVER THE STRING*/
for (var i:Number = 0; i< textoLen; i++)
{
//<block1>
if ( currentIndex == maxCharPerLine || i == textoLen -1 ){
canCleanData = true;
}
//<block2> 22
if ( currentIndex <= maxCharPerLine ){
cachedCharsForLine.push(textoStr[i]);
//trace(cachedCharsForLine);
}
trace(textoStr[i]);
trace(textoStr[i] == " ");
/*is the characters a space?*/
if (textoStr[i] == " ") {
/*1. even after the condition above returns false*/
lastCachedCharsForLine = [];
lastCachedCharsForLine = cachedCharsForLine;
}
/*as you can see from the output this value is being updated every iteration after the first space get found
when it was suppose to be updated only if the a char of type <space> get found"
*/
trace("-----------------" + lastCachedCharsForLine)
//<block4>
if( currentIndex == maxCharPerLine || i == textoLen -1 ){
if (textoStr[i]==" " || textoStr[i+1]==" "){
trace("n A");
//trace("@@@ " + lastCachedCharsForLine);
textLine[currentLine] = lastCachedCharsForLine;
trace("//" + textLine[currentLine]);
}
else{
trace("n B");
//trace("@@@ " + lastCachedCharsForLine);
textLine[currentLine] = lastCachedCharsForLine;
trace("//" + textLine[currentLine]);
}
currentIndex = 0;
currentLine ++;
}
//<block5>
if (currentLine > 1 && canCleanData){
trace("DATA CLEANED");
canCleanData = false;
cachedCharsForLine = [];
lastCachedCharsForLine = [];
}
currentIndex ++;
}
return textLine;
}else{
return textLine[0] = false;
}
}
var texto:String = "Theres something going wrong and it's driving me crazy.";
var output:Array = []
output = splitString({"d_string":texto,"d_limit":15});
for (var i:Number = 0; i<output.length; i++){
trace(output[i] + "nn");
}
lastCachedCharsForLine 的变量正在更新,从此跟踪行中可以看到。
trace("-----------------" + lastCachedCharsForLine)
即使条件为波纹管返回假
if (textoStr[i] == " ") {
/*1. even after the condition above returns false*/
lastCachedCharsForLine = [];
lastCachedCharsForLine = cachedCharsForLine;
}
这很有趣。 以下代码输出:
|-------------|
something is
going wrong
and i can't
figure out
what's the
problem.
WORDTHATISWAYTOOLONGFORTHEBUFFER.
A quick brown
fox jumped
over the lazy
dog.
package {
import flash.display.Sprite;
final public class Test2 extends Sprite {
public function Test2() {
splitIntoLines("something is going wrong and i can't figure out what's the problem. WORDTHATISWAYTOOLONGFORTHEBUFFER. A quick brown fox jumped over the lazy dog.");
}
private function splitIntoLines(text:String, maxLineLength:int = 15):void {
const words:Array = text.split(/s+/);
const output:Array = [];
var buffer:String = '';
while (words.length) {
var word:String = words.shift() as String;
// if buffer has something, add a space
if (buffer.length) {
if (buffer.length + word.length + 1 < maxLineLength) {
buffer += ' ' + word;
} else {
output.push(buffer);
buffer = word;
}
// otherwise, it's the first word
} else {
if (buffer.length + word.length < maxLineLength) {
buffer += word;
} else {
output.push(buffer);
buffer = word;
}
}
}
// something is still in there?
if (buffer.length) {
output.push(buffer);
}
trace(output.join('n'));
}
}
}
如果你使用Grant Skinner的StringUtils
库,可能会让你的生活更轻松:
http://gskinner.com/blog/archives/2007/04/free_extension.html
truncate
方法是您要查找的:
var line:String = "Something is going wrong and I can't figure out what's the problem."
var truncatedLine:String = StringUtils.truncate(line, 15, "...");