1

in advance thanks for help.

I am trying to make calculator application (for specific purposes) and I would like to know, if there exist a way how to convert Double() to NSMutableAttributedString. I need this for label output answer.

Reason of using NSMutableAttributedString is because I would like to have answer with subscripts and upper-scripts.

//example of my code
var a = Double(), b = Double(), c = Double()
a = Double(textField1.text!)
b = Double(textField2.text!)
c = a + b
let font:UIFont? = UIFont(name: "Courier", size:12)
let fontSuper:UIFont? = UIFont(name: "Courier", size:10)


//for x_1 (subscript for "1")
x1_t:NSMutableAttributedString = NSMutableAttributedString(string: "x1", attributes: [NSFontAttributeName:font!])
x1_t.setAttributes([NSFontAttributeName:fontSuper!,NSBaselineOffsetAttributeName:-4], range: NSRange(location:1,length:1))


var result = NSMutableAttributedText()
// what to do to get output for a label like "x_1 = String(c) m"

If there exist another way like append String() to NSAtributedString() - I am looking forward for answers.

2 Answers2

0

I am still not quit sure how to do it, but I could create simple function, which is approximately doing what I need. Here I am sharing my answer in case someone has the same question, but in case someone knows better answer, share it with others :)

var randomstring = "Random ="

var prestring1 = NSMutableAttributedString(string: randomstring)
var afterstring1 = NSMutableAttributedString(string: "m2")
var result1 = Double()
result1 = 42.1

func stringer (prestring: NSMutableAttributedString, result: Double, afterstring: NSMutableAttributedString) -> NSMutableAttributedString {
var mutableatributedresult = NSMutableAttributedString(string: String(result))
var mutableaddition = NSMutableAttributedString(string: " ")
var alltext = NSMutableAttributedString()

alltext.append(prestring)
alltext.append(mutableaddition)
alltext.append(mutableatributedresult)
alltext.append(mutableaddition)
alltext.append(afterstring)

return alltext
}

stringer(prestring: prestring1, result: result1, afterstring: afterstring1)

//This should give result of "Random = 42.1 m2"

If someone knows better solution I am curious.

0

As I understand it, your input strings (named "prestring1" and "afterstring1" in your own answer) could just be normal strings without attributes, because you only need the final result to be an attributed string.

This would drastically simplify your function, for example you could use string interpolation first and then only make an attributed string and move up (or down) the last part (or any part you want, I'm using an hardcoded range in my example but it's just an example).

Like:

let randomstring = "Random ="
let afterstring = "m2"
let result: Double = 42.1

func stringer (pre: String,
               result: Double,
               post: String) -> NSMutableAttributedString
{
    let base = "\(pre) \(result) \(post)"
    let mutable = NSMutableAttributedString(string: base)
    mutable.addAttribute(NSBaselineOffsetAttributeName, value: 4,
                         range: NSRange(location: mutable.length - 2, length: 2))
    return mutable
}

let attributedString = stringer(pre: randomstring, result: result, post: afterstring)

Gives:

enter image description here

Eric Aya
  • 69,473
  • 35
  • 181
  • 253
  • Of course, if I misunderstood and if you do need `NSMutableAttributedString`s as inputs, please comment so that I can update... or delete. ;) – Eric Aya Nov 17 '16 at 20:01
  • Thank you for your reply! I like your way a lot. Thing is that sometimes I need to put attributed string even before (like V_Ed = 21 m^2; _ subscript, ^ superscript). I couldn't find real tutorial how to do it apart from ".append". The way how you actually create result of NSMutableAttributedString and later just append attributes is much better and universal than in my case, because you can setup later any part of attributes at any part of text. You answered my question, thanks again! – Robert Waltera Dec 04 '16 at 22:28