blob: 957207151930c249a9b141546d74b74c86f2e564 [file] [log] [blame]
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Number patterns - Spark 3.5.0 Documentation</title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&Courier+Prime:wght@400;700&display=swap" rel="stylesheet">
<link href="css/custom.css" rel="stylesheet">
<script src="js/vendor/modernizr-2.6.1-respond-1.1.0.min.js"></script>
<link rel="stylesheet" href="css/pygments-default.css">
<link rel="stylesheet" href="css/docsearch.min.css" />
<link rel="stylesheet" href="css/docsearch.css">
<!-- Matomo -->
<script type="text/javascript">
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["disableCookies"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '40']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body class="global">
<!--[if lt IE 7]>
<p class="chromeframe">You are using an outdated browser. <a href="https://browsehappy.com/">Upgrade your browser today</a> or <a href="http://www.google.com/chromeframe/?redirect=true">install Google Chrome Frame</a> to better experience this site.</p>
<![endif]-->
<!-- This code is taken from http://twitter.github.com/bootstrap/examples/hero.html -->
<nav class="navbar navbar-expand-lg navbar-dark p-0 px-4 fixed-top" style="background: #1d6890;" id="topbar">
<div class="navbar-brand"><a href="index.html">
<img src="img/spark-logo-rev.svg" width="141" height="72"/></a><span class="version">3.5.0</span>
</div>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarCollapse" aria-controls="navbarCollapse"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav me-auto">
<li class="nav-item"><a href="index.html" class="nav-link">Overview</a></li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarQuickStart" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Programming Guides</a>
<div class="dropdown-menu" aria-labelledby="navbarQuickStart">
<a class="dropdown-item" href="quick-start.html">Quick Start</a>
<a class="dropdown-item" href="rdd-programming-guide.html">RDDs, Accumulators, Broadcasts Vars</a>
<a class="dropdown-item" href="sql-programming-guide.html">SQL, DataFrames, and Datasets</a>
<a class="dropdown-item" href="structured-streaming-programming-guide.html">Structured Streaming</a>
<a class="dropdown-item" href="streaming-programming-guide.html">Spark Streaming (DStreams)</a>
<a class="dropdown-item" href="ml-guide.html">MLlib (Machine Learning)</a>
<a class="dropdown-item" href="graphx-programming-guide.html">GraphX (Graph Processing)</a>
<a class="dropdown-item" href="sparkr.html">SparkR (R on Spark)</a>
<a class="dropdown-item" href="api/python/getting_started/index.html">PySpark (Python on Spark)</a>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarAPIDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">API Docs</a>
<div class="dropdown-menu" aria-labelledby="navbarAPIDocs">
<a class="dropdown-item" href="api/scala/org/apache/spark/index.html">Scala</a>
<a class="dropdown-item" href="api/java/index.html">Java</a>
<a class="dropdown-item" href="api/python/index.html">Python</a>
<a class="dropdown-item" href="api/R/index.html">R</a>
<a class="dropdown-item" href="api/sql/index.html">SQL, Built-in Functions</a>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarDeploying" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Deploying</a>
<div class="dropdown-menu" aria-labelledby="navbarDeploying">
<a class="dropdown-item" href="cluster-overview.html">Overview</a>
<a class="dropdown-item" href="submitting-applications.html">Submitting Applications</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="spark-standalone.html">Spark Standalone</a>
<a class="dropdown-item" href="running-on-mesos.html">Mesos</a>
<a class="dropdown-item" href="running-on-yarn.html">YARN</a>
<a class="dropdown-item" href="running-on-kubernetes.html">Kubernetes</a>
</div>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" id="navbarMore" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">More</a>
<div class="dropdown-menu" aria-labelledby="navbarMore">
<a class="dropdown-item" href="configuration.html">Configuration</a>
<a class="dropdown-item" href="monitoring.html">Monitoring</a>
<a class="dropdown-item" href="tuning.html">Tuning Guide</a>
<a class="dropdown-item" href="job-scheduling.html">Job Scheduling</a>
<a class="dropdown-item" href="security.html">Security</a>
<a class="dropdown-item" href="hardware-provisioning.html">Hardware Provisioning</a>
<a class="dropdown-item" href="migration-guide.html">Migration Guide</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="building-spark.html">Building Spark</a>
<a class="dropdown-item" href="https://spark.apache.org/contributing.html">Contributing to Spark</a>
<a class="dropdown-item" href="https://spark.apache.org/third-party-projects.html">Third Party Projects</a>
</div>
</li>
<li class="nav-item">
<input type="text" id="docsearch-input" placeholder="Search the docs…">
</li>
</ul>
<!--<span class="navbar-text navbar-right"><span class="version-text">v3.5.0</span></span>-->
</div>
</nav>
<div class="container">
<div class="left-menu-wrapper">
<div class="left-menu">
<h3><a href="sql-programming-guide.html">Spark SQL Guide</a></h3>
<ul>
<li>
<a href="sql-getting-started.html">
Getting Started
</a>
</li>
<li>
<a href="sql-data-sources.html">
Data Sources
</a>
</li>
<li>
<a href="sql-performance-tuning.html">
Performance Tuning
</a>
</li>
<li>
<a href="sql-distributed-sql-engine.html">
Distributed SQL Engine
</a>
</li>
<li>
<a href="sql-pyspark-pandas-with-arrow.html">
PySpark Usage Guide for Pandas with Apache Arrow
</a>
</li>
<li>
<a href="sql-migration-guide.html">
Migration Guide
</a>
</li>
<li>
<a href="sql-ref.html">
SQL Reference
</a>
</li>
<ul>
<li>
<a href="sql-ref-ansi-compliance.html">
ANSI Compliance
</a>
</li>
<li>
<a href="sql-ref-datatypes.html">
Data Types
</a>
</li>
<li>
<a href="sql-ref-datetime-pattern.html">
Datetime Pattern
</a>
</li>
<li>
<a href="sql-ref-number-pattern.html">
Number Pattern
</a>
</li>
<li>
<a href="sql-ref-functions.html">
Functions
</a>
</li>
<li>
<a href="sql-ref-identifier.html">
Identifiers
</a>
</li>
<li>
<a href="sql-ref-literals.html">
Literals
</a>
</li>
<li>
<a href="sql-ref-null-semantics.html">
Null Semantics
</a>
</li>
<li>
<a href="sql-ref-syntax.html">
SQL Syntax
</a>
</li>
</ul>
<li>
<a href="sql-error-conditions.html">
Error Conditions
</a>
</li>
</ul>
</div>
</div>
<input id="nav-trigger" class="nav-trigger" checked type="checkbox">
<label for="nav-trigger"></label>
<div class="content-with-sidebar mr-3" id="content">
<h1 class="title">Number Patterns for Formatting and Parsing</h1>
<h3 id="description">Description</h3>
<p>Functions such as <code class="language-plaintext highlighter-rouge">to_number</code> and <code class="language-plaintext highlighter-rouge">to_char</code> support converting between values of string and
Decimal type. Such functions accept format strings indicating how to map between these types.</p>
<h3 id="syntax">Syntax</h3>
<p>Number format strings support the following syntax:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> { ' [ MI | S ] [ $ ]
[ 0 | 9 | G | , ] [...]
[ . | D ]
[ 0 | 9 ] [...]
[ $ ] [ PR | MI | S ] ' }
</code></pre></div></div>
<h3 id="elements">Elements</h3>
<p>Each number format string can contain the following elements (case insensitive):</p>
<ul>
<li>
<p><strong><code class="language-plaintext highlighter-rouge">0</code></strong> or <strong><code class="language-plaintext highlighter-rouge">9</code></strong></p>
<p>Specifies an expected digit between <code class="language-plaintext highlighter-rouge">0</code> and <code class="language-plaintext highlighter-rouge">9</code>.</p>
<p>A sequence of 0 or 9 in the format string matches a sequence of digits with the same or smaller
size. If the 0/9 sequence starts with 0 and is before the decimal point, it requires matching the
number of digits exactly: when parsing, it matches only a digit sequence of the same size; when
formatting, the result string adds left-padding with zeros to the digit sequence to reach the
same size. Otherwise, the 0/9 sequence matches any digit sequence with the same or smaller size
when parsing, and pads the digit sequence with spaces (if before the decimal point) or zeros (if
after the decimal point) in the result string when formatting. Note that the digit sequence will
become a &#8216;#&#8217; sequence when formatting if the size is larger than the 0/9 sequence.</p>
</li>
<li>
<p><strong><code class="language-plaintext highlighter-rouge">.</code></strong> or <strong><code class="language-plaintext highlighter-rouge">D</code></strong></p>
<p>Specifies the position of the decimal point. This character may only be specified once.</p>
<p>When parsing, the input string does not need to include a decimal point.</p>
</li>
<li>
<p><strong><code class="language-plaintext highlighter-rouge">,</code></strong> or <strong><code class="language-plaintext highlighter-rouge">G</code></strong></p>
<p>Specifies the position of the <code class="language-plaintext highlighter-rouge">,</code> grouping (thousands) separator.</p>
<p>There must be a <code class="language-plaintext highlighter-rouge">0</code> or <code class="language-plaintext highlighter-rouge">9</code> to the left and right of each grouping separator. When parsing,
the input string must match the grouping separator relevant for the size of the number.</p>
</li>
<li>
<p><strong><code class="language-plaintext highlighter-rouge">$</code></strong></p>
<p>Specifies the location of the <code class="language-plaintext highlighter-rouge">$</code> currency sign. This character may only be specified once.</p>
</li>
<li>
<p><strong><code class="language-plaintext highlighter-rouge">S</code></strong></p>
<p>Specifies the position of an optional &#8216;+&#8217; or &#8216;-&#8216; sign. This character may only be specified once.</p>
</li>
<li>
<p><strong><code class="language-plaintext highlighter-rouge">MI</code></strong></p>
<p>Specifies the position of an optional &#8216;-&#8216; sign (no &#8216;+&#8217;). This character may only be specified once.</p>
<p>When formatting, it prints a space for positive values.</p>
</li>
<li>
<p><strong><code class="language-plaintext highlighter-rouge">PR</code></strong></p>
<p>Maps negative input values to wrapping angle brackets (<code class="language-plaintext highlighter-rouge">&lt;1&gt;</code>) in the corresponding string.</p>
<p>Positive input values do not receive wrapping angle brackets.</p>
</li>
</ul>
<h3 id="function-types-and-error-handling">Function types and error handling</h3>
<ul>
<li>The <code class="language-plaintext highlighter-rouge">to_number</code> function accepts an input string and a format string argument. It requires that
the input string matches the provided format and raises an error otherwise. The function then
returns the corresponding Decimal value.</li>
<li>The <code class="language-plaintext highlighter-rouge">try_to_number</code> function accepts an input string and a format string argument. It works the
same as the <code class="language-plaintext highlighter-rouge">to_number</code> function except that it returns NULL instead of raising an error if the
input string does not match the given number format.</li>
<li>The <code class="language-plaintext highlighter-rouge">to_char</code> function accepts an input decimal and a format string argument. The function then
returns the corresponding string value.</li>
<li>All functions will fail if the given format string is invalid.</li>
</ul>
<h3 id="examples">Examples</h3>
<p>The following examples use the <code class="language-plaintext highlighter-rouge">to_number</code>, <code class="language-plaintext highlighter-rouge">try_to_number</code>, and <code class="language-plaintext highlighter-rouge">to_char</code> SQL
functions.</p>
<p>Note that the format string used in most of these examples expects:</p>
<ul>
<li>an optional sign at the beginning,</li>
<li>followed by a dollar sign,</li>
<li>followed by a number between 3 and 6 digits long,</li>
<li>thousands separators,</li>
<li>up to two digits beyond the decimal point.</li>
</ul>
<h4 id="the-to_number-function">The <code class="language-plaintext highlighter-rouge">to_number</code> function</h4>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- The negative number with currency symbol maps to characters in the format string.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_number</span><span class="p">(</span><span class="s1">'-$12,345.67'</span><span class="p">,</span> <span class="s1">'S$999,099.99'</span><span class="p">);</span>
<span class="o">-</span><span class="mi">12345</span><span class="p">.</span><span class="mi">67</span>
<span class="c1">-- The '$' sign is not optional.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_number</span><span class="p">(</span><span class="s1">'5'</span><span class="p">,</span> <span class="s1">'$9'</span><span class="p">);</span>
<span class="n">Error</span><span class="p">:</span> <span class="n">the</span> <span class="k">input</span> <span class="n">string</span> <span class="n">does</span> <span class="k">not</span> <span class="k">match</span> <span class="n">the</span> <span class="n">given</span> <span class="n">number</span> <span class="n">format</span>
<span class="c1">-- The plus sign is optional, and so are fractional digits.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_number</span><span class="p">(</span><span class="s1">'$345'</span><span class="p">,</span> <span class="s1">'S$999,099.99'</span><span class="p">);</span>
<span class="mi">345</span><span class="p">.</span><span class="mi">00</span>
<span class="c1">-- The format requires at least three digits.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_number</span><span class="p">(</span><span class="s1">'$45'</span><span class="p">,</span> <span class="s1">'S$999,099.99'</span><span class="p">);</span>
<span class="n">Error</span><span class="p">:</span> <span class="n">the</span> <span class="k">input</span> <span class="n">string</span> <span class="n">does</span> <span class="k">not</span> <span class="k">match</span> <span class="n">the</span> <span class="n">given</span> <span class="n">number</span> <span class="n">format</span>
<span class="c1">-- The format requires at least three digits.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_number</span><span class="p">(</span><span class="s1">'$045'</span><span class="p">,</span> <span class="s1">'S$999,099.99'</span><span class="p">);</span>
<span class="mi">45</span><span class="p">.</span><span class="mi">00</span>
<span class="c1">-- MI indicates an optional minus sign at the beginning or end of the input string.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_number</span><span class="p">(</span><span class="s1">'1234-'</span><span class="p">,</span> <span class="s1">'999999MI'</span><span class="p">);</span>
<span class="o">-</span><span class="mi">1234</span>
<span class="c1">-- PR indicates optional wrapping angel brakets.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_number</span><span class="p">(</span><span class="s1">'9'</span><span class="p">,</span> <span class="s1">'999PR'</span><span class="p">)</span>
<span class="mi">9</span>
</code></pre></div></div>
<h4 id="the-try_to_number-function">The <code class="language-plaintext highlighter-rouge">try_to_number</code> function:</h4>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- The '$' sign is not optional.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">try_to_number</span><span class="p">(</span><span class="s1">'5'</span><span class="p">,</span> <span class="s1">'$9'</span><span class="p">);</span>
<span class="k">NULL</span>
<span class="c1">-- The format requires at least three digits.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">try_to_number</span><span class="p">(</span><span class="s1">'$45'</span><span class="p">,</span> <span class="s1">'S$999,099.99'</span><span class="p">);</span>
<span class="k">NULL</span>
</code></pre></div></div>
<h4 id="the-to_char-function">The <code class="language-plaintext highlighter-rouge">to_char</code> function:</h4>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_char</span><span class="p">(</span><span class="nb">decimal</span><span class="p">(</span><span class="mi">454</span><span class="p">),</span> <span class="s1">'999'</span><span class="p">);</span>
<span class="nv">"454"</span>
<span class="c1">-- '99' can format digit sequence with a smaller size.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_char</span><span class="p">(</span><span class="nb">decimal</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="s1">'99.9'</span><span class="p">);</span>
<span class="nv">" 1.0"</span>
<span class="c1">-- '000' left-pads 0 for digit sequence with a smaller size.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_char</span><span class="p">(</span><span class="nb">decimal</span><span class="p">(</span><span class="mi">45</span><span class="p">.</span><span class="mi">1</span><span class="p">),</span> <span class="s1">'000.00'</span><span class="p">);</span>
<span class="nv">"045.10"</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_char</span><span class="p">(</span><span class="nb">decimal</span><span class="p">(</span><span class="mi">12454</span><span class="p">),</span> <span class="s1">'99,999'</span><span class="p">);</span>
<span class="nv">"12,454"</span>
<span class="c1">-- digit sequence with a larger size leads to '#' sequence.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_char</span><span class="p">(</span><span class="nb">decimal</span><span class="p">(</span><span class="mi">78</span><span class="p">.</span><span class="mi">12</span><span class="p">),</span> <span class="s1">'$9.99'</span><span class="p">);</span>
<span class="nv">"$#.##"</span>
<span class="c1">-- 'S' can be at the end.</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_char</span><span class="p">(</span><span class="nb">decimal</span><span class="p">(</span><span class="o">-</span><span class="mi">12454</span><span class="p">.</span><span class="mi">8</span><span class="p">),</span> <span class="s1">'99,999.9S'</span><span class="p">);</span>
<span class="nv">"12,454.8-"</span>
<span class="o">&gt;</span> <span class="k">SELECT</span> <span class="n">to_char</span><span class="p">(</span><span class="nb">decimal</span><span class="p">(</span><span class="mi">12454</span><span class="p">.</span><span class="mi">8</span><span class="p">),</span> <span class="s1">'L99,999.9'</span><span class="p">);</span>
<span class="n">Error</span><span class="p">:</span> <span class="n">cannot</span> <span class="n">resolve</span> <span class="s1">'to_char(Decimal(12454.8), '</span><span class="n">L99</span><span class="p">,</span><span class="mi">999</span><span class="p">.</span><span class="mi">9</span><span class="s1">')'</span> <span class="n">due</span> <span class="k">to</span> <span class="k">data</span> <span class="k">type</span> <span class="n">mismatch</span><span class="p">:</span>
<span class="n">Unexpected</span> <span class="nb">character</span> <span class="s1">'L'</span> <span class="k">found</span> <span class="k">in</span> <span class="n">the</span> <span class="n">format</span> <span class="n">string</span> <span class="s1">'L99,999.9'</span><span class="p">;</span> <span class="n">the</span> <span class="k">structure</span> <span class="k">of</span> <span class="n">the</span> <span class="n">format</span>
<span class="n">string</span> <span class="n">must</span> <span class="k">match</span><span class="p">:</span> <span class="p">[</span><span class="n">MI</span><span class="o">|</span><span class="n">S</span><span class="p">]</span> <span class="p">[</span><span class="err">$</span><span class="p">]</span> <span class="p">[</span><span class="mi">0</span><span class="o">|</span><span class="mi">9</span><span class="o">|</span><span class="k">G</span><span class="o">|</span><span class="p">,]</span><span class="o">*</span> <span class="p">[.</span><span class="o">|</span><span class="n">D</span><span class="p">]</span> <span class="p">[</span><span class="mi">0</span><span class="o">|</span><span class="mi">9</span><span class="p">]</span><span class="o">*</span> <span class="p">[</span><span class="err">$</span><span class="p">]</span> <span class="p">[</span><span class="n">PR</span><span class="o">|</span><span class="n">MI</span><span class="o">|</span><span class="n">S</span><span class="p">];</span> <span class="n">line</span> <span class="mi">1</span> <span class="n">pos</span> <span class="mi">25</span>
</code></pre></div></div>
</div>
<!-- /container -->
</div>
<script src="js/vendor/jquery-3.5.1.min.js"></script>
<script src="js/vendor/bootstrap.bundle.min.js"></script>
<script src="js/vendor/anchor.min.js"></script>
<script src="js/main.js"></script>
<script type="text/javascript" src="js/vendor/docsearch.min.js"></script>
<script type="text/javascript">
// DocSearch is entirely free and automated. DocSearch is built in two parts:
// 1. a crawler which we run on our own infrastructure every 24 hours. It follows every link
// in your website and extract content from every page it traverses. It then pushes this
// content to an Algolia index.
// 2. a JavaScript snippet to be inserted in your website that will bind this Algolia index
// to your search input and display its results in a dropdown UI. If you want to find more
// details on how works DocSearch, check the docs of DocSearch.
docsearch({
apiKey: 'd62f962a82bc9abb53471cb7b89da35e',
appId: 'RAI69RXRSK',
indexName: 'apache_spark',
inputSelector: '#docsearch-input',
enhancedSearchInput: true,
algoliaOptions: {
'facetFilters': ["version:3.5.0"]
},
debug: false // Set debug to true if you want to inspect the dropdown
});
</script>
<!-- MathJax Section -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
TeX: { equationNumbers: { autoNumber: "AMS" } }
});
</script>
<script>
// Note that we load MathJax this way to work with local file (file://), HTTP and HTTPS.
// We could use "//cdn.mathjax...", but that won't support "file://".
(function(d, script) {
script = d.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.onload = function(){
MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ["$", "$"], ["\\\\(","\\\\)"] ],
displayMath: [ ["$$","$$"], ["\\[", "\\]"] ],
processEscapes: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
}
});
};
script.src = ('https:' == document.location.protocol ? 'https://' : 'http://') +
'cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js' +
'?config=TeX-AMS-MML_HTMLorMML';
d.getElementsByTagName('head')[0].appendChild(script);
}(document));
</script>
</body>
</html>