String interpolation explained

In computer programming, string interpolation (or variable interpolation, variable substitution, or variable expansion) is the process of evaluating a string literal containing one or more placeholders, yielding a result in which the placeholders are replaced with their corresponding values. It is a form of simple template processing[1] or, in formal terms, a form of quasi-quotation (or logic substitution interpretation). The placeholder may be a variable name, or in some languages an arbitrary expression, in either case evaluated in the current context.

String interpolation is an alternative to building string via concatenation, which requires repeat quoting and unquoting;[2] or substituting into a printf format string, where the variable is far from where it is used. Compare:apples = 4puts "I have # apples." # string interpolationputs "I have " + String(apples) + " apples." # string concatenationputs "I have %d apples." % apples # format string

Two types of literal expression are usually offered: one with interpolation enabled, the other without. Non-interpolated strings may also escape sequences, in which case they are termed a raw string, though in other cases this is separate, yielding three classes of raw string, non-interpolated (but escaped) string, interpolated (and escaped) string. For example, in Unix shells, single-quoted strings are raw, while double-quoted strings are interpolated. Placeholders are usually represented by a bare or a named sigil (typically $ or %), e.g. $apples or %apples, or with braces, e.g. {apples}, sometimes both, e.g. ${apples}. In some cases additional formatting specifiers can be used (as in printf), e.g. {apples:3}, and in some cases the formatting specifiers themselves can be interpolated, e.g. {apples:width}. Expansion of the string usually occurs at run time.

Language support for string interpolation varies widely. Some languages do not offer string interpolation, instead using concatenation, simple formatting functions, or template libraries. String interpolation is common in many programming languages which make heavy use of string representations of data, such as Apache Groovy, Julia, Kotlin, Perl, PHP, Python, Ruby, Scala, Swift, Tcl and most Unix shells.

Algorithms

There are two main types of variable-expanding algorithms for variable interpolation:[3]

  1. Replace and expand placeholders: creating a new string from the original one, by find–replace operations. Find variable reference (placeholder), replace it by its variable value. This algorithm offers no cache strategy.
  2. Split and join string: splitting the string into an array, merging it with the corresponding array of values, then joining items by concatenation. The split string can be cached for reuse.

Security issues

String interpolation, like string concatenation, may lead to security problems. If user input data is improperly escaped or filtered, the system will be exposed to SQL injection, script injection, XML external entity (XXE) injection, and cross-site scripting (XSS) attacks.[4]

An SQL injection example: query = " "If $id is replaced with "'; {{code|2=sql|1=DELETE FROM Table; SELECT * FROM Table WHERE id='}}", executing this query will wipe out all the data in Table.

Examples

ABAP

See main article: ABAP. DATA(apples) = 4.WRITE |I have apples|.The output will be:I have 4 apples

Bash

See main article: Bash (Unix shell). apples=4echo "I have $apples apples"

  1. or

echo "I have $ apples"The output will be:I have 4 apples

Boo

See main article: Boo (programming language). apples = 4print("I have $(apples) apples")

  1. or

print("I have apples" % apples)The output will be:I have 4 apples

C#

See main article: C Sharp (programming language). var apples = 4;var bananas = 3;

Console.WriteLine($"I have apples");Console.WriteLine($"I have fruits");[5]

The output will be:I have 4 applesI have 7 fruits

ColdFusion Markup Language

See main article: article and ColdFusion Markup Language.

ColdFusion Markup Language (CFML) script syntax:apples = 4;writeOutput("I have #apples# apples");

Tag syntax:I have #apples# apples

The output will be:

CoffeeScript

See main article: CoffeeScript. apples = 4console.log "I have # apples"The output will be:I have 4 apples

Dart

See main article: Dart (programming language). int apples = 4, bananas = 3;print('I have $apples apples.');print('I have $ fruits.');The output will be:I have 4 apples.I have 7 fruits.

Go

See main article: Go (programming language)., Go does not have string interpolation. There have been some proposals for string interpolation in the next version of the language, Go 2.[6] [7] Instead, Go uses printf format strings in the fmt.Sprintf function, string concatenation, or template libraries like text/template.

Groovy

See main article: Groovy (programming language). In groovy, interpolated strings are known as GStrings:[8] def quality = "superhero"final age = 52def sentence = "A developer is a $quality if he is $"println sentenceThe output will be:A developer is a superhero if he is seasoned

Haxe

See main article: Haxe. var apples = 4;var bananas = 3;trace('I have $apples apples.');trace('I have $ fruits.');The output will be:[9] I have 4 apples.I have 7 fruits.

Java

See main article: article and Java (programming language). Java 21 does have interpolated strings thanks to JEP 430. In jshell you could use the constant STR of java.lang.StringTemplate directly.enum Stagerecord Deploy(UUID image, Stage stage)var deploy=new Deploy(UUID.randomUUID, Stage.test)STR."Installing \ on Stage \ ..."var deploy=new Deploy(UUID.randomUUID, Stage.prod)STR."Installing \ on Stage \ ..."

https://openjdk.org/jeps/430

JavaScript

See main article: article and JavaScript. JavaScript, as of the ECMAScript 2015 (ES6) standard, supports string interpolation using backticks ``. This feature is called template literals.[10] Here is an example:const apples = 4;const bananas = 3;console.log(`I have $ apples`);console.log(`I have $ fruits`);The output will be:I have 4 applesI have 7 fruits

Template literals can also be used for multi-line strings:console.log(`This is the first line of text.This is the second line of text.`);

The output will be:This is the first line of text.This is the second line of text.

Julia

See main article: Julia (programming language). apples = 4bananas = 3print("I have $apples apples and $bananas bananas, making $(apples + bananas) pieces of fruit in total.")The output will be:I have 4 apples and 3 bananas, making 7 pieces of fruit in total.

Kotlin

See main article: Kotlin (programming language). val quality = "superhero"val apples = 4val bananas = 3val sentence = "A developer is a $quality. I have $ fruits"println(sentence)The output will be:A developer is a superhero. I have 7 fruits

Nemerle

See main article: Nemerle. def apples = 4;def bananas = 3;Console.WriteLine($"I have $apples apples.");Console.WriteLine($"I have $(apples + bananas) fruit.");It also supports advanced formatting features, such as:def fruit = ["apple", "banana"];Console.WriteLine($<#I have ..$(fruit; "\n"; f => f + "s")#>);The output will be:applesbananas

Nim

See main article: Nim (programming language). Nim provides string interpolation via the strutils module.Formatted string literals inspired by Python F-string are provided via the strformat module,the strformat macro verifies that the format string is well-formed and well-typed,and then are expanded into Nim source code at compile-time.import strutils, strformatvar apples = 4var bananas = 3echo "I have $1 apples".format(apples)echo fmt"I have apples"echo fmt"I have fruits"

  1. Multi-line

echo fmt"""I have apples"""

  1. Debug the formatting

echo fmt"I have apples"

  1. Custom openChar and closeChar characters

echo fmt("I have (apples) ", '(', ')')

  1. Backslash inside the formatted string literal

echo fmt"""""" The output will be:I have 4 applesI have 4 applesI have 7 fruitsI have4 applesI have apples=4 applesI have 4 yepope

Nix

See main article: Nix package manager. let numberOfApples = "4";in "I have $ apples"The output will be:I have 4 apples

ParaSail

See main article: ParaSail (programming language). const Apples := 4const Bananas := 3Println ("I have `(Apples) apples.\n")Println ("I have `(Apples+Bananas) fruits.\n")The output will be:I have 4 apples.I have 7 fruits.

Perl

See main article: Perl. my $apples = 4;my $bananas = 3;print "I have $apples apples.\n";print "I have @ fruit.\n"; # Uses the Perl array (@) interpolation.The output will be:I have 4 apples.I have 7 fruit.

PHP

See main article: PHP. The output will be:There are 5 apples and 3 bananas.I have 5 apples and 3 bananas.

Python

See main article: Python (programming language). Python supports string interpolation as of version 3.6, referred to as "formatted string literals".[11] [12] [13] Such a literal begins with an f or F before the opening quote, and uses braces for placeholders:apples = 4bananas = 3print(f'I have apples and bananas')The output will be:I have 4 apples and 3 bananas

Ruby / Crystal

See main article: Ruby (programming language).

See main article: Crystal (programming language). apples = 4puts "I have # apples"

  1. Format string applications for comparison:

puts "I have %s apples" % applesputs "I have % apples" %

The output will be:I have 4 apples

Rust

See main article: article and Rust (programming language).

Rust does not have general string interpolation, but provides similar functionality via macros, referred to as "Captured identifiers in format strings", introduced in version 1.58.0, released 2022-01-13.[14]

Rust provides formatting via the std::fmt module, which is interfaced with through various macros such as format!, write!, and print!. These macros are converted into Rust source code at compile-time, whereby each argument interacts with a formatter. The formatter supports positional parameters, named parameters, argument types, defining various formatting traits, and capturing identifiers from the environment.

let (apples, bananas) = (4, 3);// println! captures the identifiers when formatting: the string itself isn't interpolated by Rust.println!("There are apples and bananas.");The output will be:There are 4 apples and 3 bananas.

Scala

See main article: article and Scala (programming language).

Scala 2.10+ provides a general facility to allow arbitrary processing of a string literal, and supports string interpolation using the included s and f string interpolators. It is also possible to write custom ones or override the standard ones.

The f interpolator is a compiler macro that rewrites a format string with embedded expressions as an invocation of String.format. It verifies that the format string is well-formed and well-typed.

The standard interpolators

Scala 2.10+'s string interpolation allows embedding variable references directly in processed string literals. Here is an example:val apples = 4val bananas = 3//before Scala 2.10printf("I have %d apples\n", apples)println("I have %d apples" format apples)//Scala 2.10+println(s"I have $apples apples")println(s"I have $ fruits")println(f"I have $apples%d apples")

The output will be:I have 4 apples

Sciter (tiscript)

In Sciter any function with name starting from $ is considered as interpolating function and so interpolation is customizable and context sensitive:var apples = 4var bananas = 3var domElement = ...;

domElement.$content(

I have apples

);domElement.$append(

I have fruits

);

Where domElement.$content(

I have apples

); gets compiled to this:domElement.html = "

I have " + apples.toHtmlString + " apples

";

Snobol

See main article: article and SNOBOL. apples = 4 ; bananas = 3 Output = "I have " apples " apples." Output = "I have " (apples + bananas) " fruits."The output will be:I have 4 apples.I have 7 fruits.

Swift

See main article: article and Swift (programming language).

In Swift, a new String value can be created from a mix of constants, variables, literals, and expressions by including their values inside a string literal.[15] Each item inserted into the string literal is wrapped in a pair of parentheses, prefixed by a backslash.

let apples = 4print("I have \(apples) apples")The output will be:I have 4 apples

Tcl

See main article: article and Tcl.

The Tool Command Language has always supported string interpolation in all quote-delimited strings.

set apples 4puts "I have $apples apples."The output will be:I have 4 apples.

In order to actually format - and not simply replace - the values, there is a formatting function.

set apples 4puts [format "I have %d apples." $apples]

TypeScript

See main article: article and TypeScript.

As of version 1.4, TypeScript supports string interpolation using backticks ``. Here is an example:var apples: number = 4;console.log(`I have $ apples`);The output will be:I have 4 applesThe console.log function can be used as a printf function. The above example can be rewritten, thusly:var apples: number = 4;console.log("I have %d apples", apples);The output remains the same.

Visual Basic

As of Visual Basic 14, string interpolation is supported in Visual Basic.[16] name = "Tom"Console.WriteLine($"Hello, ")

The output will be:

See also

Notes and References

  1. "Enforcing Strict Model-View Separation in Template Engines", T. Parr (2004), WWW2004 conference.
  2. Web site: Interpolation in Perl . "This is much tidier than repeat uses of the '.' concatenation operator.".
  3. https://code.google.com/p/smallest-template-system/wiki/SimplestAlgorithm "smallest-template-system/Simplest algorithms"
  4. Web site: Secure String Interpolation. google-caja.googlecode.com . https://web.archive.org/web/20121019065315/http://google-caja.googlecode.com/svn/changes/mikesamuel/string-interpolation-29-Jan-2008/trunk/src/js/com/google/caja/interp/index.html#-autogen-id-1 . 2012-10-19.
  5. Web site: Strings - C# Programming Guide. 15 March 2024 .
  6. Web site: proposal: Go 2: string interpolation #34174. .
  7. Web site: proposal: Go 2: string interpolation evaluating to string and list of expressions #50554. .
  8. Web site: The Apache Groovy programming language - Syntax. 2021-06-20. groovy-lang.org.
  9. News: Haxe - Manual - String interpolation. Haxe - The Cross-platform Toolkit. 2017-09-12.
  10. Web site: Template literals (Template strings) - JavaScript | MDN. 31 May 2024 .
  11. Web site: The Python Tutorial: 7.1.1. Formatted String Literals.
  12. Web site: The Python Language Reference: 2.4.3. Formatted string literals.
  13. Web site: PEP 498 -- Literal String Interpolation.
  14. Web site: Announcing Rust 1.58.0: Captured identifiers in format strings . 2022-01-13.
  15. Web site: Strings and Characters — The Swift Programming Language (Swift 5.5). 2021-06-20. docs.swift.org.
  16. Web site: KathleenDollard. Interpolated Strings - Visual Basic. 2021-06-20. docs.microsoft.com. en-us.