Доброго времени суток всем.
Столкнулся с проблемой, не могу понять, в чем проблема.
Опишу задачу в пару словах, необходимо из строки выбрать дроби и отобразить их, все бы хорошо, но при большом количестве цифр числителя или знаменателя перестает корректно работать метод
getCharBoundaries. Привожу кусок рабочего кода с ошибкой.
Код AS3:
var myTextField:TextField;
var myTextFormat:TextFormat = new TextFormat();
var arrayDecimal:Array = new Array();
myTextFormat.size = 20;
myTextFormat.leading = myTextFormat.size;
var str:String = "Для приготовления салата использовали 723333333333333333333/9 кг огурцов, помидоров на 2/9 кг меньше, чем огурцов, а перца на 878754554656565555555555555555527423423423/9 кг больше. Сколько килограммов огурцов и помидоров и перца использовали для приготовления салата?";
createProblemSituation()
function createProblemSituation()
{
var _index:int = str.indexOf("/");
if (_index!=-1)
{
var pattern:RegExp = new RegExp(/([0-9]+)\/([0-9]+)/g);
str = str.replace(pattern,replaceStr);
}
myTextField = createText(str,0,0,550);
this.addChild(myTextField);
searcSymbol(arrayDecimal);
}
function replaceStr():String
{
var n:uint = Math.max(arguments[1].length,arguments[2].length);
var _obj:Object = {length:n,numerator:arguments[1],denominator:arguments[2]};
arrayDecimal.push(_obj);
var _str:String = "–";
while (n!=1)
{
_str += "–";
n--;
}
return _str;
}
function searcSymbol(array:Array):void
{
var _index:int = 0;
var _frame:Rectangle;
//var _spotlight:Shape;
var _numerator:TextField;
var _denominator:TextField;
trace(myTextField.text.length);
for (var i:uint = 0; i<array.length; i++)
{
_index = myTextField.text.indexOf('–',_index);
if (_index!=-1)
{
_frame = myTextField.getCharBoundaries(_index);
trace(_frame,_index);
_numerator = createText(array[i].numerator,(_frame.x - _frame.width/5),(_frame.y - _frame.height/2));
_denominator = createText(array[i].denominator,(_frame.x - _frame.width/5),(_frame.y + _frame.height/2));
this.addChild(_numerator);
this.addChild(_denominator);
_index += array[i].length;
}
}
}
function createText(str:String,x:int=0,y:int=0,w:uint=0):TextField
{
var _txt:TextField = new TextField();
_txt.x = x;
_txt.y = y;
//_txt.border = true;
_txt.selectable = false;
_txt.autoSize = TextFieldAutoSize.LEFT;
_txt.multiline = true;
if(w!=0){
_txt.wordWrap = true;
_txt.width = w;
}
_txt.text = str;
_txt.setTextFormat(myTextFormat);
return _txt;
}