diff --git a/CHANGES.md b/CHANGES.md
index 03e90acb8e..a631b26860 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -34,6 +34,7 @@ Language Improvements:
- fix(yaml) Fix tags to include non-word characters (#2486) [Peter Plantinga][]
- fix(swift) `@objcMembers` was being partially highlighted (#2543) [Nick Randall][]
- enh(dart) Add `late` and `required` keywords, and `Never` built-in type (#2550) [Sam Rawlins][]
+- enh(erlang) Add underscore separators to numeric literals (#2554) [Sergey Prokhorov][]
[Josh Goebel]: https://github.com/yyyc514
[Peter Plantinga]: https://github.com/pplantinga
@@ -42,6 +43,7 @@ Language Improvements:
[Hankun Lin]: https://github.com/Linhk1606
[Nick Randall]: https://github.com/nicked
[Sam Rawlins]: https://github.com/srawlins
+[Sergey Prokhorov]: https://github.com/seriyps
## Version 10.0.2
diff --git a/src/languages/erlang-repl.js b/src/languages/erlang-repl.js
index 6ba6e0ed49..5d1e6679e9 100644
--- a/src/languages/erlang-repl.js
+++ b/src/languages/erlang-repl.js
@@ -23,7 +23,7 @@ export default function(hljs) {
hljs.COMMENT('%', '$'),
{
className: 'number',
- begin: '\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)',
+ begin: '\\b(\\d+(_\\d+)*#[a-fA-F0-9]+(_[a-fA-F0-9]+)*|\\d+(_\\d+)*(\\.\\d+(_\\d+)*)?([eE][-+]?\\d+)?)',
relevance: 0
},
hljs.APOS_STRING_MODE,
diff --git a/src/languages/erlang.js b/src/languages/erlang.js
index 2cec6aecf5..e37b94ea53 100644
--- a/src/languages/erlang.js
+++ b/src/languages/erlang.js
@@ -20,7 +20,7 @@ export default function(hljs) {
var COMMENT = hljs.COMMENT('%', '$');
var NUMBER = {
className: 'number',
- begin: '\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)',
+ begin: '\\b(\\d+(_\\d+)*#[a-fA-F0-9]+(_[a-fA-F0-9]+)*|\\d+(_\\d+)*(\\.\\d+(_\\d+)*)?([eE][-+]?\\d+)?)',
relevance: 0
};
var NAMED_FUN = {
diff --git a/test/markup/erlang/numbers.expect.txt b/test/markup/erlang/numbers.expect.txt
new file mode 100644
index 0000000000..9fdb67b1ae
--- /dev/null
+++ b/test/markup/erlang/numbers.expect.txt
@@ -0,0 +1,14 @@
+Integer = 1234
+BigInteger = 1_234_000
+NegInteger = -20_000
+Float = 2.34
+BigFloat = 3_333.14159_26535_89793
+SciFloat = 2.4e23
+PlusSciFloat = 2.4e+23
+SmallSciFloat = 2.4e-23
+Binary = 2#1010
+StrangeBinary = 2#1010_1010_1010
+Octal = 8#777
+StrangeOctal = 8#777_666_555
+Hex = 16#1ABEF
+StrangeHex = 16#1234_FACE_987D
diff --git a/test/markup/erlang/numbers.txt b/test/markup/erlang/numbers.txt
new file mode 100644
index 0000000000..d14aff8819
--- /dev/null
+++ b/test/markup/erlang/numbers.txt
@@ -0,0 +1,14 @@
+Integer = 1234
+BigInteger = 1_234_000
+NegInteger = -20_000
+Float = 2.34
+BigFloat = 3_333.14159_26535_89793
+SciFloat = 2.4e23
+PlusSciFloat = 2.4e+23
+SmallSciFloat = 2.4e-23
+Binary = 2#1010
+StrangeBinary = 2#1010_1010_1010
+Octal = 8#777
+StrangeOctal = 8#777_666_555
+Hex = 16#1ABEF
+StrangeHex = 16#1234_FACE_987D